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

本文深入探讨了UNIX环境下exec函数家族的特性和使用方法,包括execl、execv、execle、execve等函数的区别,以及如何通过这些函数替换当前进程的程序。通过一个示例程序展示了exec函数成功执行后原有程序将被新程序覆盖的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

函数声明

这里写图片描述

特性

  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参数去修改环境变量;其余四个函数会复制现有的环境;

这里写图片描述

调用关系

这里写图片描述

例子

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值