免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2229 | 回复: 4
打印 上一主题 下一主题

[进程管理] exec()函数与char* argv[]的问题 [复制链接]

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-18 20:06 |只看该作者 |倒序浏览
一个二进制C程序,返回每一个参数argv[]:
  1. /* Program source : showargs.c *  
  2. * Program name   : showargs   */  
  3. #include <unistd.h>  
  4. int  main(int argc, char *argv[])  
  5. {  
  6.    int i;  
  7.    for(i = 0; i < argc; i++)  
  8.                 {  
  9.                    printf("arg[%d]: %s\n", i, argv[i]);  
  10.                 }  
  11.    return 0;  
  12. }  
复制代码
在终端中 $ ./showargs xxx
有结果 :
arg[0]: ./showargs
arg[1]: xxx

//尽管exec函数的参数列表中第二个参数by convention是待执行文件的文件名,但此处忽略;
如果用execl()函数调用回显参数的程序showargs
  1. execl("/home/hit/showargs","xxx",NULL);
复制代码
时,
结果:
arg[0]: xxx

我的问题是,第二次,arg[0]怎么不是 "/home/hit/showargs" 这个可执行文件自身的文件名? 而第一次的argv[0]就是它的文件名啊?
难道第一次,shell把所有的参数 “ ./showargs xxx ”通过execl()传给了回显程序 而第二次我们自己直接调用execl()时只传了"xxx"的原因?
如果不是,这到底是怎么实现的呢?

谢谢!


论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2013-04-19 21:11 |只看该作者
你第二次的argv[0]就是第二次运行的程序名字了。bash创建进程的时候,通过exec系统调用,传入参数,创建新进程。但是bash有他自己的地址空间,所以两个进程的argv是都不一样的

论坛徽章:
0
3 [报告]
发表于 2013-04-19 21:40 |只看该作者
回复 1# hitcser01
execl()函数声明如下:
extern int execl(_const char *_path,const char *_argv[],...,NULL)
shell执行程序时调用execl系统调用时传递的变量数组argv[]是以文件名 参数1 参数2 ...的形式存放的,而你主动调用只是传了“xxx”,仅此不同吧


   

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
4 [报告]
发表于 2013-04-19 22:56 |只看该作者
回复 2# amarant
谢谢!有个疑问,第二种情况下,execl()之后让其暂停时 ps -e,发现只有showargs而没有"xxx",和您说的 arg[0]: xxx 即为程序的名字有矛盾吗?对linux不懂。。。

回复 3# junnyg
谢谢!

   

论坛徽章:
0
5 [报告]
发表于 2013-04-29 23:10 |只看该作者
shell在创建进程的时候就是把程序路径和参数打包作为argv的。
类似于 execl("/home/hit/showargs","/home/hit/showargs\0xxx",NULL);这样写法不对,应该是分别赋给argv【0】和argv【1】
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP