linux下exec 函数第一个参数和第二个参数的区别

刚在看书时,读到exec函数族时,第一个参数为可执行文件或者文件名,后面的是参数,在我看到例子使用的时候如下:execl("/bin/echo","echo","exec... 刚在看书时,读到exec 函数族时,第一个参数为可执行文件或者文件名,后面的是参数,在我看到例子使用的时候如下:
execl ("/bin/echo", "echo", "executed by execl", NULL)
execl ("/home/sar/bin/echoall, "echoall", "myarg1", "myarg2" , (char *)0)
或者:
execlp("echoall", "echoall", "only 1 arg", (char *)0)
。。。
看了很多例子,第一个参数明显可以说明命令了,为何又在第二个参数再加个相同命令作为参数,这另我很不解,求解
展开
 我来答
喻邱雅翠
2011-05-14 · TA获得超过601个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:123万
展开全部
哪里写的这些...好乱阿..

先解释下基本的:

int main(argc,char * argv[])
main的参数,就是命令行参数.

比如你的可执行文件是test,你希望在程序执行时传入IP地址,那么可以这样:

./test 127.0.0.1

此时,argc =1,argv[1]是就是指向"127.0.0.1"指针(命令参数全部当作字符串来处理的)。
而 argv[0]就代表第一个参数,这里对应的就是"./test"。
argc和argv在mian里面都是可以使用的,出了main的范围就不能使用了。

再来说你提出的第一个地方,exec的问题。

exec实际上包含了一组函数,execl, execlp, execle, execv, execvp, execvpe
具体使用方法,你man execv就可以得到这些函数的使用方法。

exec函数的作用是,产生一个新进程,结束当前进程(具体执行的操作是复制当前进程的一部分数据和权限,然后根据参数启动一个新的进程)。

exec这组函数执行时候,需要提供的参数包括:一个可执行程序的路径,传递给可执行程序的参数。(这里的参数,与刚才说到的main的参数含义相同。)

说到这里应该明白了吧...就一个。

我不知道你要hello world干什么...照你意思给写了个.

第一个,就是你贴出来的代码改动一点点(我这边运行有点问题):

#include <stdio.h>
main(int argc,char* argv[])
{
int i=0
while(i<=argc)
{
printf("arguement %d : %s ",i,argv[i]);
printf("\n");
i++;
}
}

运行程序:
$gcc test.c -o test
$./test hello world
输出结果:
[ksl@myhost WGX]$ ./test hello world
Arguement 0:./test
Arguement 1:hello
Arguement 2:world
Arguement 3:(null)

然后第二个,使用exec的例子,我用execl吧..
文件名是test1.c

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

void main(int argc,char *argv[])
{
printf("This is not exec...");

execl("./test","hello","world",NULL);

//如果exec执行正常,下面的printf将不会被执行
//因为当前进程已经结束,./test将被执行
printf("exec error");
}

输出结果:
[ksl@myhost WGX]$ ./test1
Arguement 0:hello
Arguement 1:world
Arguement 2:(null)

后者并没输出"./test"....就是exec启动的程序,其命令行参数中只有参数.(我也不晓得原因...=.=||)
whmbbta
2011-05-25 · TA获得超过2838个赞
知道小有建树答主
回答量:992
采纳率:0%
帮助的人:514万
展开全部
哪里写的这些...好乱阿..

先解释下基本的:

int main(argc,char * argv[])
main的参数,就是命令行参数.

比如你的可执行文件是test,你希望在程序执行时传入IP地址,那么可以这样:

./test 127.0.0.1

此时,argc =1,argv[1]是就是指向"127.0.0.1"指针(命令参数全部当作字符串来处理的)。
而 argv[0]就代表第一个参数,这里对应的就是"./test"。
argc和argv在mian里面都是可以使用的,出了main的范围就不能使用了。

再来说你提出的第一个地方,exec的问题。

exec实际上包含了一组函数,execl, execlp, execle, execv, execvp, execvpe
具体使用方法,你man execv就可以得到这些函数的使用方法。

exec函数的作用是,产生一个新进程,结束当前进程(具体执行的操作是复制当前进程的一部分数据和权限,然后根据参数启动一个新的进程)。

exec这组函数执行时候,需要提供的参数包括:一个可执行程序的路径,传递给可执行程序的参数。(这里的参数,与刚才说到的main的参数含义相同。)

说到这里应该明白了吧...就一个。

我不知道你要hello world干什么...照你意思给写了个.

第一个,就是你贴出来的代码改动一点点(我这边运行有点问题):

#include <stdio.h>
main(int argc,char* argv[])
{
int i=0
while(i<=argc)
{
printf("arguement %d : %s ",i,argv[i]);
printf("\n");
i++;
}
}

运行程序:
$gcc test.c -o test
$./test hello world
输出结果:
[ksl@myhost WGX]$ ./test hello world
Arguement 0:./test
Arguement 1:hello
Arguement 2:world
Arguement 3:(null)

然后第二个,使用exec的例子,我用execl吧..
文件名是test1.c

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

void main(int argc,char *argv[])
{
printf("This is not exec...");

execl("./test","hello","world",NULL);

//如果exec执行正常,下面的printf将不会被执行
//因为当前进程已经结束,./test将被执行
printf("exec error");
}

输出结果:
[ksl@myhost WGX]$ ./test1
Arguement 0:hello
Arguement 1:world
Arguement 2:(null)

后者并没输出"./test"....就是exec启动的程序,其命令行参数中只有参数.(我也不晓得原因...=.=||)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吐噜线y
2011-05-25 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1.2万
采纳率:0%
帮助的人:0
展开全部
不知道你是不是学习编程的,如果不是就没必要看了。

1.PID是进程标识号,它是一个进程的唯一性标识。PPID是该进程父进程的进程标识号。

2.fork和exec和pid完全就是2件事情不能混为一谈。fork是一个linux库函数。他是用来创建一个新的进程。至于exec是一个系列函数,C标准库函数,用来改变进程上下文的。2者结合使用可以创建一个新的进程。

3.如果创建新的进程,一般是用fork,他会返回这个被创建进程的PID,你可以通过PID找到这个进程。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6e87166
推荐于2017-11-19 · TA获得超过117个赞
知道小有建树答主
回答量:167
采纳率:0%
帮助的人:110万
展开全部
int execlp(const char *file, const char *arg, ...);这个是函数原型
其实你可以在第二个参数的地方添加任何参数,而不需要是文件名,你可以试试。
比方说execl(" /bin/ls", "aaa", "-la", "NULL")
你看看打出来什么就知道第一个参数有什么用
追问
你好,我运行了一下,确实有区别,execl(" /bin/ls", "ls", "/home/da/Test/", (char *)0);像这样添加第二个参数"ls”的话,运行就会输出/home/da/Test目录的内容,如果不加第二个参数“ls",如:
execl(" /bin/ls", "/home/da/Test/", (char *)0);这时输出当前程序所在目录的内容,而不是/home/da/Test目录的内容,虽然有区别,但仍然不知具体是什么差别?其它非ls命令也是这样吗?可否再指点下
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
BAI度LAN
2017-11-18
知道答主
回答量:2
采纳率:0%
帮助的人:1795
展开全部

The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn.  Together they describe a list of one  or  more  pointers  to  null-terminated strings that represent the argument list available to the executed program.  The first argument, by convention, should point to the filename associated with the file being executed.  The list of arguments must  be
terminated  by  a null pointer, and, since these are variadic functions, this pointer must be cast (char *)NULL.

简单解释一下,上面这一段是在linux终端下"man 3 exec"查看手册时复制的一段对exec函数的描述。The first argument, by convention, should point to the filename associated with the file being executed.其中这句话就关于第一个参数这么说的:按照惯例,第一个参数应该是要被执行的文件的文件名(不含路径)。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式