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个函数中,只有execle和execve使用了char *envp[]传递环境变量,其它的4个函数都没有这个参数,这并不意味着它们不传递环境变量,这4个函数将把默认的环境变量不做任何修改地传给被执行的应用程序。而execle和execve会用指定的环境变量去替代默认的那些。
3. 路径要求不一致
以p结尾的函数execlp和execvp,它们和的差别很小
execl与execv的第1个参数path必须是一个完整的路径,如"/bin/ls"
execlp和execvp的第1个参数 file可以简单到仅仅是一个文件名,如 "ls",这两个函数可以自动到环境变量PATH制定的目录里去寻找。
实例学习请参考一下一篇博客
- exec函数
- exec 函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec函数
- exec 函数
- exec函数
- exec函数
- exec函数
- exec函数
- 【设计模式】类之间的关联关系及其在UML中的表现方法
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- Porting iperf to Android
- 在CentOS6.3中通过KVM创建CentOS6.3虚拟机无法进入图形界面
- C语言——著名的Josephus问题练习
- exec函数
- Uva11806——容斥原理
- 如何让html页面不缓存
- 线程条件变量pthread_cond_t用法
- python与perl的矩阵转换及多样品的PCA
- 什么是“测感”
- struts2标签--form中的theme属性
- 解决webseverice 发布后别人无法访问的问题
- 反向投影图