Linux应用开发用法:exec系列函数execve的应用怎么用

 一、execve介绍

exec系列函数可以在同一个进程跳转执行另一个程序,如execve

二、execve的函数原型和参数介绍

int execve (const char * path, char *const argv[], char *constenvp[])

一共有三个参数

1. const char * path :要传入执行的路径
2.char *const argv[]:这个参数有三个参数
        (1)执行的路径
        (2)执行程序要传入的参数(argv[1](argv[0]代表可执行文件本身,所以这里的参数下标为1)在这里,也可以事先定义好字符串传入
        (3)NULL
3.char *constenvp[]:两个参数
        (1)环境变量
        (2)NULL
return:成功不返回(因为这是跳转函数,成功后,下面的代码无意义),相反返回-1

三、用法

这里举的例子是尚硅谷班长上二楼的例子

    pid_t pid = fork(); //fork会复制父进程的所有资源
    if(pid < 0)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0)
    {
        //子进程代码
        strcpy(buffer,"fork's son\r\n");
        
        char *name = "banzhang";
        char *args[] = {"/work/fork/erlou", name, NULL};
        char *envs[] = {NULL};
        int re = execve(args[0], args, envs);
        if(re == -1)
            {
                printf("%s up st failed\n", name);
            }
        //上楼成功不再执行子进程以下程序
    }
    else 
    {
        //父进程代码
        sleep(1);
        strcpy(buffer,"fork\r\n");
        printf("old %d after invent %d learn continue\r\n", getpid(), pid);
    }

使用fork()新建子进程之后,若创建成功,不进行跳转execve的话,其父子进程都是在此文件内运行的,借用execve函数,将子程序跳转到另一个文件中运行(形象比喻成班主任和班长在一楼,班长因为execve上了二楼)

注意此处几个地方:

1.        char *args[] = {"/work/fork/erlou", name, NULL};是指针数组,第一个元素代表要跳转文件的路径(此处的erlou就是gcc -o生成的可执行文件)

2.        char *envs[] = {NULL};此处环境变量可以填NULL,因为此时路径就已经在其环境中

3.        int re = execve(args[0], args, envs);根据前文中提到的参数介绍,此处第一个参数是args指针数组的第一个元素,即路径字符串,而第二个参数是数组args(包含所有参数),第三个参数测试envs(注意此时在char *args[]中的第二个参数,我们没使用argv[1],而是直接使用自己赋值的字符串char *name

4.返回-1则表示跳转失败,否则表示成功,跳转成功后子进程跳转以下的函数将不再执行。

这是本篇所有内容,谢谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值