exec函数族

  1. execlexeclpexecle

    • execl:接受一个以NULL结尾的参数列表,用于指定可执行文件的路径和命令行参数。
    • execlp:与execl类似,但是它会在PATH环境变量指定的目录中搜索可执行文件。
    • execle:在execl的基础上,还允许传递环境变量数组。
  2. execvexecvpexecvpe

    • execv:接受一个参数数组,用于指定可执行文件的路径和命令行参数。
    • execvp:与execv类似,但是它会在PATH环境变量指定的目录中搜索可执行文件。
    • execvpe:在execvp的基础上,还允许传递环境变量数组。
  3. execve

    • 接受一个参数数组和一个环境变量数组,用于指定可执行文件的路径、命令行参数和环境变量。

在这些函数执行成功后,当前进程的地址空间将被新程序的内容替代,而且这些函数不会返回。它们的返回值仅在执行失败时为-1,失败时进程将继续执行。

这种机制允许一个进程在不创建新的进程的情况下,用其他程序替代自己的内存空间,这对于实现一些特定的功能,比如在一个进程中执行另一个程序,是非常有用的。

 

 

一、execl

/*
        #include <unistd.h>
        int execl(const char *pathname, const char *arg, ...);
            参数:
                -path: 需要指定的可执行文件的路径
                -arg:  第一个参数一般没有什么用,一般写可执行文件的名称
                       第二个参数开始,就是程序执行所需要的参数列表
                       参数最后需要以NULL结束(哨兵)
            返回值:
                只有当调用出错有返回值 -1
                成功没有返回值
*/

#include "stdio.h"
#include "unistd.h"

int main(){
    pid_t pid =fork();
    if(pid>0){
        printf("i am parent: %d \n",getpid());

    } else if(pid==0){
        //execl("hello","helko",NULL);
        execl("bin/ps","ps","aux",NULL);
        printf("i am a child: %d \n",getpid());  // 子进程不会执行
    }

    for (int i=0;i<3;i++){ // 子进程中不会执行
        printf("%d.%d",i,getpid());
    }
    return 0;
}

二、execlp

/*
        int execlp(const char *file, const char *arg, ...);
            作用: 会在环境变量中查找指定的可执行文件,如果找到了就执行,找不到就不执行
            参数:
                -file: 需要指定的可执行文件的名称
                -arg:  第一个参数一般没有什么用,一般写可执行文件的名称
                       第二个参数开始,就是程序执行所需要的参数列表
                       参数最后需要以NULL结束(哨兵)
            返回值:
                只有当调用出错有返回值 -1
                成功没有返回值
*/

#include "stdio.h"
#include "unistd.h"

int main(){
    pid_t pid =fork();
    if(pid>0){
        printf("i am parent: %d \n",getpid());

    } else if(pid==0){
        //execl("hello","helko",NULL);
        execlp("ps","ps","aux",NULL);
        perror("execlp");
        printf("i am a child: %d \n",getpid());  // 子进程不会执行
    }
    for (int i=0;i<3;i++){ // 子进程中不会执行
        printf("%d.%d",i,getpid());
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值