cdsfiui 发表于 2015-02-04 09:57

[结贴]我感觉execl的第一个参数和第二个参数有重叠,帮我看一下吧

本帖最后由 cdsfiui 于 2015-02-04 18:15 编辑

如题,我学习了一下execl函数的用法:
#include<unistd.h>
int main()
{
execl("ls", "ls", "-al");
return 0;
}
OK,什么也不打印,于是我改了一下:
#include<unistd.h>
int main()
{
execl("/bin/ls", "ls", "-al", 0);
return 0;
}
很奇怪啊,execl第一个参数必须是path,我如果把调用语句改成execl("/bin", "ls", "-al", 0);
发现也不行。那岂不是说这个path参数必须包含可执行程序的名字本身? 可是这样的话,execl的第二个参数就是文件名啊,第二个参数岂不是多余了?

非常疑惑,求解释!

zsszss0000 发表于 2015-02-04 11:12

乌龟的臀部,规定

爻易 发表于 2015-02-04 14:29

第1个参数是里子,第2个参数是面子!

cdsfiui 发表于 2015-02-04 14:34

爻易 发表于 2015-02-04 14:29 static/image/common/back.gif
第1个参数是里子,第2个参数是面子!

path里面包含了file的名字,那还要第二个file参数干什么呢? 感觉多余

爻易 发表于 2015-02-04 14:36

第2个参数将传给进程,也就是argv

爻易 发表于 2015-02-04 14:40

进程可以通过查看面子有多大,就能看人下菜碟-哦是随机应变了!

cdsfiui 发表于 2015-02-04 18:15

爻易 发表于 2015-02-04 14:36 static/image/common/back.gif
第2个参数将传给进程,也就是argv

果然是高手!我验证了你的说法,第二个参数是argv,可以是任何东西,不必是可执行文件名。程序如下:
$ cat s.cpp
#include<stdio.h>
int main(int argc, char* argv[])
{
for(int i=0;i<argc;++i)
    printf("%s\n",argv);
return 0;
}

$ g++ s.cpp -o s.bin
$ cat exec.cpp
#include<unistd.h>
int main()
{
execl("./s.bin", "myself", "p1", "p2", 0);
return 0;
}

$ g++ exec.cpp && ./a.out
myself
p1
p2
页: [1]
查看完整版本: [结贴]我感觉execl的第一个参数和第二个参数有重叠,帮我看一下吧