《UNIX环境高级编程》(exec)

《UNIX环境高级编程》(exec)

函数声明

《UNIX环境高级编程》(exec)_第1张图片

特性

  1. exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段,它并不创建新的进程;
  2. exec函数如果执行成功,新的程序会覆盖旧的程序,除非调用出错,否则不会跑exec后面的代码;

函数区别

  1. execl、execv、execle、execve的第一个参数是pathname,而execlp、execvp的第一个参数是filename。如果filename中包含/,则视为路径名,否则就按PATH环境变量去指定目录查找可执行文件;如果execlp、execvp找到了一个可执行文件,但是这个不是有效的可执行文件,则会认为是一个shell脚本;
  2. 第二个区别与参数有关系,带l字母的表示list,带v字母的表示vector。execl、execlp、execle每个命令行参数都是一个单独的参数,并以空指针结尾;execv、execvp、execve,应先构造一个指向各参数的指针数组,然后将数组地址传入;
  3. 第三个区别主要是跟环境变量相关。execle、execve可以通过envp参数去修改环境变量;其余四个函数会复制现有的环境;

《UNIX环境高级编程》(exec)_第2张图片

调用关系

《UNIX环境高级编程》(exec)_第3张图片

例子

这个例子主要说明上面的特性内容,如果子进程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");
}

你可能感兴趣的:(linux,exec)