LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 849|回复: 2

关于exec的 path 与 arg0的关系

[复制链接]
发表于 2009-9-7 19:13:47 | 显示全部楼层 |阅读模式
exec()函数族的声明如下:
       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
拿execl来说,它会把path表示的文件load进来,并且把arg0,...传递给这个程序。
很多文档上都说,arg0一般就是path里的文件名,但是为什么呢?apue里说:This is a convention only. We can set argv[0] to any string we like.  那么也就是说argv[0]是个没用的参数了?
发表于 2009-9-7 19:43:33 | 显示全部楼层
exec 调用的是 exec 族里面的 第一个参数指定的 文件,即可执行程序。后面的 都是作为参数传递给 这个可执行程序。。。

通常, 调用 exec 族时候, arg0 指定为 第一个参数的文件名。。。就如 main(int argc, char *argv[]). 此时新的程序的 main 接受到参数, argv[0] 就可以正确的指定为 程序名。。
但是,随便指定一个 名字也是可以的。。。不过仅仅影响 argv[0] 这个参数而已。

如上, argv参数只不过是传递给 调用的程序而已。。。你要是随便指定 argv[0] 的话, 若被调用程序 打印 argv[0], 就是打印传递给他的 argv[0]...

自己可以做个实验。。。我做过了。。。确实如上所示。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 20:02:14 | 显示全部楼层
做了个实验,这下懂了。argv[0]不是没作用,只是大家都把文件名作为argv[0]的话,就可以通过它知道文件名了。谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表