exec函数族
学习目标:
掌握exec函数族
exec函数族 :
exec函数族 :fork创建子进程后执行的是和父进程相同的程序,子进程往往要调用一种exec函数执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行,调用exec并不创建新进程,所有调用exec前后该进程的id并未改变。
execlp/execl函数:
execlp/execl函数:execlp函数会从PATH环境变量所指目录查找符合参数file的文件名,然后执行该文件;execl函数用来执行参数path字符串所代表的文件路径。
int execlp(const char *file,const char *arg,....,/*(char *)NULL*/);
int execl(const char *path,const char *arg,....,/*(char *)NULL*/);
参数:
file: 要加载的程序的名字,通常用来调用系统程序,如:ls、date、cp等命令。
arg: 将该参数当作文件的argv[0],argv[1].....,从argv[0]开始,最后一个参数必须以NULL(空指针)结束。
path: 路径+程序名。
返回值:
成功:不返回。
失败:-1,设置errono。
execvp函数:
execvp函数:加载一个进程,使用自定义环境变量。
int execvp(const char *file,const char *argv[]);
参数:
file: 要加载的程序的名字,通常用来调用系统程序,如:ls、date、cp等命令。
argv[]: 将该参数传给欲执行的文件
path: 路径+程序名。
返回值:
成功:不返回。
失败:-1,设置errono。
exec函数族一般规律:
exec函数一定那调用成功即执行新的程序,不返回。只有失败才返回。错误值-1.所以通常直接在exec函数调用后直接调用perror()和exit(),无需if判断。
- l(list)命令函参数列表。
- p(path)搜索file时使用的path变量
- v(vector)使用命令行参数数组
- e(environment)使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量。
只有execve是真正的系统调用,其他五个函数最终都调用execv。
函数关系图如下: