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

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

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

求解一下,昨晚大便时看到题目
搞了1个小时都没做出来
很纠结
...全文
191 18 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
歪门邪道!

69,381

社区成员

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

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