《UNIX环境高级编程》(exec)
函数声明
特性
- exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段,它并不创建新的进程;
- exec函数如果执行成功,新的程序会覆盖旧的程序,除非调用出错,否则不会跑exec后面的代码;
函数区别
- execl、execv、execle、execve的第一个参数是pathname,而execlp、execvp的第一个参数是filename。如果filename中包含/,则视为路径名,否则就按PATH环境变量去指定目录查找可执行文件;如果execlp、execvp找到了一个可执行文件,但是这个不是有效的可执行文件,则会认为是一个shell脚本;
- 第二个区别与参数有关系,带l字母的表示list,带v字母的表示vector。execl、execlp、execle每个命令行参数都是一个单独的参数,并以空指针结尾;execv、execvp、execve,应先构造一个指向各参数的指针数组,然后将数组地址传入;
- 第三个区别主要是跟环境变量相关。execle、execve可以通过envp参数去修改环境变量;其余四个函数会复制现有的环境;
调用关系
例子
这个例子主要说明上面的特性
内容,如果子进程exec执行成功,则不会打印exec over
void demo(void)
{
pid_t pid;
if((pid=fork()) < 0)
{
printf("fork error\n");
}
else if(pid == 0)
{
printf("child process\n");
// if execl exec success, this process will be replace by the execl("ls"),
// and it will not print "exec over", if exec fail, it will print "exec over"
if(execl("/bin/ls", "ls", "./", (char *)0) < 0)
printf("exec error\n");
printf("exec over\n");
}
sleep(1);
printf("parent process\n");
}