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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下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)
。。。
看了很多例子,第一个参数明显可以说明命令了,为何又在第二个参数再加个相同命令作为参数,这另我很不解,求解

哪里写的这些...好乱阿..

先解释下基本的:

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启动的程序,其命令行参数中只有参数.(我也不晓得原因...=.=||)
参考技术A 哪里写的这些...好乱阿..

先解释下基本的:

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启动的程序,其命令行参数中只有参数.(我也不晓得原因...=.=||)
参考技术B 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命令也是这样吗?可否再指点下

本回答被提问者采纳
参考技术C 不知道你是不是学习编程的,如果不是就没必要看了。

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

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

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

参考技术D

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.其中这句话就关于第一个参数这么说的:按照惯例,第一个参数应该是要被执行的文件的文件名(不含路径)。

以上是关于linux下exec 函数第一个参数和第二个参数的区别的主要内容,如果未能解决你的问题,请参考以下文章

js中的reduce()函数

test,exec,match,replace方法区别 正则

php在linux下配制webhook

JSON.stringify() 的使用

SendMessage函数是干啥用的 它都有哪些参数

定位类中的第一个和第二个值