exec函数族

exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。

在Linux中使用exec函数族主要有两种情况:
● 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生。
● 如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程,这种情况非常普遍,以至于Linux专门为其作了优化,我们已经知道,fork会将调用进程的所有内容原封不动的拷贝到新产生的子进程中去,这些拷贝的动作很消耗时间,而如果fork完之后我们马上就调用exec,这些辛辛苦苦拷贝来的东西又会被立刻抹掉,这看起来非常不划算,于是人们设计了一种"写时拷贝(copy-on-write)"技术,使得fork结束后并不立刻复制父进程的内容,而是到了真正实用的时候才复制,这样如果下一条语句是exec,它就不会白白作无用功了,也就提高了效率。


exec函数族的6个成员函数

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

其中只有execve 是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。

名字中的'l', 'p', 'e', 'v'的含义。
'l'表示传递的参数是以列表形式出现即分开的,需要一个一个的传递,比如:execl("/bin/ps", "ps", "ajx", NULL), 其中第一个参数代表传递的一个要执行的程序的路径,第二个参数必须和第一个参数的文件保持一致,后边的 ajx,NULL都是参数,而且最后一个参数必须是NULL。

'v'表示函数传递的参数是以组合形式的传递而不用一个一个的传递,比如:
char *buf[] = {"ps", "ajx", NULL};
execv("/bin/ps", buf),其中buf这个指针数组包含了需要传递参数并且最有一个参数是NULL。

'p'表示exec函数要传递可执行文件的名字,不需要传递文件路径,系统就会自动按照环境变量$PATH所指定的路径进行查找,比如:execp("ps", "ps", "ajx", NULL);

'e'表示传递给新进程的环境变量,比如:
char *buf[] = {"PATH=/usr/bin", NULL};
execle("./test", NULL, buf);
那么在新的进程中环境变量PATH就变成/usr/bin下的内容了。


对于由exec函数启动的进程来说,它的参数表和环境加在一起的总长度是有限制的。上限由ARG_MAX给出,在Linux系统上它是128K字节。其他系统可能会设置一个非常有限的长度,这有可能会导致出现问题。POSIX规范要求ARG_MAX至少要有4096个字节。


一般情况下,exec函数是不会返回的,除非发生了错误,它们才会返回-1,并且会设置错误变量errno,然后从原程序的调用点接着往下执行。
其中最常见的原因有:
● 找不到文件或路径,此时errno被设置为ENOENT。
● 数组argv和envp忘记用NULL结束,此时errno被设置为EFAUL。
● 没有对应可执行文件的运行权限,此时errno被设置为EACCES。


由exec启动的新进程继承了原进程的许多特性。特别地,在原进程中已打开的文件描述符在新进程中仍将保持打开,除非它们的“执行时关闭标志”(close on exec flag)被置位(详细说明对fcnt1系统调用的介绍)。任何在原进程中已打开的目录流都将在新进程中被关闭。


Linux下多进程编程之exec函数语法及使用实例:http://www.farsight.com.cn/news/emb188.htm
exec函数族:http://blog.csdn.net/wubin1124/article/details/5002556
exec函数族的使用:http://www.cplusplus.me/1079.html
[结贴]我感觉execl的第一个参数和第二个参数有重叠,帮我看一下吧:http://bbs.chinaunix.net/thread-4168834-1-1.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值