问大家一个问题 一道Unix高级环境编程第七章后习题

goodluckyxl 2010-04-13 10:34:13
如何不是使用参数传递和全局变量
将main中argc argv传递给其他函数

尽量不要回答写入文件,管道,环境变量然后读写之类的答案
可能是一些堆栈操作恢复的能力测试题目
很可能测试setjmp longjmp的含义理解

求解一下,昨晚大便时看到题目
搞了1个小时都没做出来
很纠结
...全文
199 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChrisAK 2010-04-30
  • 打赏
  • 举报
回复
x...写错了,重写:
showargs_argv - 0
showargs_argc - 4
main_ebp - 8
callret - 12
mainCRT_ebp - 16
argc - 20
argv - 24
ChrisAK 2010-04-30
  • 打赏
  • 举报
回复
顺便给个比较歪的方法,依赖于编译器的实现:

#include <stdio.h>

void showargs(){
int argc =*(int*)(((int)&argc)+20);
char** argv = *(char***)(((int)&argc)+24);
int i;
for (i =0;i<argc;++i){
puts (argv[i]);
}
}
void main (int argc,char* argv[])
{
showargs ();
}
VS2010的C++编译器编译调试通过.
showargs被main调用时栈结构如下:

showargs_argv - 0
showargs_argc - 4
main_ebp - 8
callret - 16
mainCRT_ebp - 20
argc - 24
argv - 26

showargs仅在被内部没有局部变量的main函数被调用时有效
Jeffrey84 2010-04-30
  • 打赏
  • 举报
回复
雷死了
ChrisAK 2010-04-30
  • 打赏
  • 举报
回复
这题既然是unix高级环境编程的,
考的肯定是对类似Windows下
GetCommandLine之类的函数的掌握,
而不是变着法儿的用非常规手段传参数.
ChrisAK 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 keiy 的回复:]
如果用setjmp可以这样做:

C/C++ code

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void subroutine(jmp_buf);

int main(int ac ,char *av[])
{

int value;
jmp_buf jumper;……
[/Quote]windows下不用那么麻烦。。。
GetCommandLine+CommandToArgvW搞定
goodluckyxl 2010-04-30
  • 打赏
  • 举报
回复
实在是耽误大家了

我找书后答案了

因为我买别人的二手书,答案被撕掉了

很抱歉 这个题目在LINUX下暂时没有很好的办法
柯本 2010-04-13
  • 打赏
  • 举报
回复
如果用setjmp可以这样做:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void subroutine(jmp_buf);

int main(int ac ,char *av[])
{

int value;
jmp_buf jumper;
int k;
char a[10];

value = setjmp(jumper);
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);

return 0;
}

void subroutine(jmp_buf jumper)
{
int s_ac;
char **s_av;
s_ac=*(int *)(jumper[0]+8);
s_av=(char **)(*(int *)(jumper[0]+12));
printf("ac=%d\n",s_ac);
for(int i=0;i<s_ac;i++)
printf("av[%d]=%s\n",i,s_av[i]);
longjmp(jumper,1);
}

在VS2005及gcc version 3.4.2 (mingw-special)通过测试
若用BCB改
s_ac=*(int *)(jumper[0]+8);
s_av=(char **)(*(int *)(jumper[0]+12));
为:
s_ac=*(int *)(jumper->j_ebp+8);
s_av=(char **)(*(int *)(jumper->j_ebp+12));

pengzhixi 2010-04-13
  • 打赏
  • 举报
回复
该不是用汇编吧。
a7182388 2010-04-13
  • 打赏
  • 举报
回复
我什么时候才能到星星啊,杯具!
goodluckyxl 2010-04-13
  • 打赏
  • 举报
回复
那个兄弟给点提示啊

讨论讨论也行啊
goodluckyxl 2010-04-13
  • 打赏
  • 举报
回复
ESCRIPTION
getopt is used to break up (parse) options in command lines for easy parsing by shell procedures, and to check for legal options. It uses the GNU
getopt(3) routines to do this.
甘草哥 这个只是语法处理的
而不是我要求的
  • 打赏
  • 举报
回复
getopt

http://blog.chinaunix.net/u/12592/showart_429841.html

倒数第3句看的我有点崩溃。
yutaooo 2010-04-13
  • 打赏
  • 举报
回复

另外,有本书:Professional Assembly Language的第11章Using Functions其中的Using Command-Line Parameters小节,讨论了如何利用cmd。当然它是从汇编角度出发的,不过我觉得是类似的,可以借鉴。

问题是,如我在11楼述,这东西现在行不行,就不清楚了。我是没做测试,不过没信心能成。

LZ参考下。
yutaooo 2010-04-13
  • 打赏
  • 举报
回复

我觉得,这道题目应该是关联7.6节。要从进程的布局角度考虑。然而,对于现在的Linux系统,想写出具有通用性的解,有难度。因为,现在引入了随机内存布局的机制。要么,找个老版本的Linux做测试?
cattycat 2010-04-13
  • 打赏
  • 举报
回复
我第一反应也是setjmp,但是用的不熟。
vc或vs等编译器就需要跨栈的指针了,就是那种在被调用的函数中调节指针大小指到调用函数中的变量。
goodluckyxl 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 keiy 的回复:]

如果用setjmp可以这样做:
C/C++ code

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void subroutine(jmp_buf);

int main(int ac ,char *av[])
{

int value;
jmp_buf jumper;
int k;
……
[/Quote]

谢谢大哥 我回家跑了测试一下
我当时想法用两个jmp 在main和函数中跳转 利用setjmp返回值返回两个参数的地址
没想直接在栈顶操作
sky198306 2010-04-13
  • 打赏
  • 举报
回复
看看,实在是有心无力
「已注销」 2010-04-13
  • 打赏
  • 举报
回复
歪门邪道!
本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一本无价的参考书籍。 目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件和目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入和输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出和标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程和进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准和实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf 和fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧