exec函数

来源:互联网 发布:魔兽数据库7.0 编辑:程序博客网 时间:2024/06/01 07:49

fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。 

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件.

六种不同的e x e c函数可供使用:

#include<unistd.h>

intexecl(const char* pathname,const char*arg0,.../*(char*)0*/);

intexecv(const char* pathname,const char*argv[]);

intexecle(const char* pathname,const char* arg0,.../*(char*)0,char*conesntvp[]*/);       

intexecve(const char* pathname,const char* argv[],char*constenvp[]);

intexeclp(const char* filename,const char* arg0,.../*(char*)0*/);

intexecvp(const char*filename, const char* argv[]);

【说明】

1.      6个函数返回:若出错则为-1,若成功则不返回

2.      如果filename中包含/,则就将其视为路径名,•否则就按PATH环境变量,在有关目录中搜寻可执行文件。

3.      在这里有点要注意,不管是arg0,还是argv[0]都必须是程序的可执行文件的名字

 

【区别】

1.      第二个区别与参数表的传递有关(l表示表(list)v表示矢量(vector))

execv开头的函数是以"char *argv[]"这样的形式传递命令行参数

execl开头的函数采用了我们更容易习惯的方式,把参数一个一个列出来,然后以一个NULL表示结束。这里的NULL的作用和argv数组里的NULL作用是一样的。 

2.      最后一个区别与向新程序传递环境表相关:

在全部6个函数中,只有execleexecve使用了char *envp[]传递环境变量,其它的4个函数都没有这个参数,这并不意味着它们不传递环境变量,这4个函数将把默认的环境变量不做任何修改地传给被执行的应用程序。而execleexecve会用指定的环境变量去替代默认的那些。 

3.      路径要求不一致

p结尾的函数execlpexecvp,它们和的差别很小

execlexecv的第1个参数path必须是一个完整的路径,如"/bin/ls"

execlpexecvp的第1个参数 file可以简单到仅仅是一个文件名,如 "ls",这两个函数可以自动到环境变量PATH制定的目录里去寻找。

 

实例学习请参考一下一篇博客

 

 

 

原创粉丝点击