LINUX----进程替换,exec族函数

execl族函数的作用

exel族函数用于调用一个已经存在的可执行程序,将该程序的运行需要的代码区和数据区的数据覆盖原进程,这样就可以实现在一个进程中调度另一个进程.

简单实现一个小功能来看一看

mytest.c

#include <stdio.h>
#include <unistd.h>

int main(){
    printf("I am mytest.c , pid = %d, ppid = %d\n",getpid(),getppid());

    execl("/home/lxs/c/execl/text.py","./text.py",NULL);
    
    printf("error\n");
    return 0;
}

text.py

print("I am Python!!")

执行结果(用c 语言调用了一个python程序)



exec族函数详解

一共六个函数,函数的前四个字母都为exec.

#include <unistd.h>
int execl(const char *pathname, const char *arg, ...
          /* (char  *) NULL */);
int execlp(const char *file, const char *arg, ...
           /* (char  *) NULL */);
int execle(const char *pathname, const char *arg, ...
           /*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
            char *const envp[]);

这些函数的命名规则:

l(list) 代表以列表的形式传参

v(vector)代表以数组的形式进行传参

p(path) 代表自主搜索环境变量,不需要传路径

e(ebv) 代表自主维护环境变量

调用六个函数

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
void Child1(){
    printf("I am child1, I show execl\n");
    execl("/usr/bin/ls","ls","-a","-l","--color",NULL);
    exit(1);
}
void Child2(){
    printf("I am child2, I show execv\n");
    char* const argv[] = {
        "ls",
        "-a",
        "-l",
        "--color",
        NULL
    };
    execv("/usr/bin/ls",argv);
    exit(1);
}
void Child3(){
    printf("I am child3, I show execlp\n");
    execlp("ls","ls","-a","-l","--color",NULL);
    exit(1);
}
void Child4(){
    printf("I am child4, I show execvp\n");
        char* const argv[] = {
        "ls",
        "-a",
        "-l",
        "--color",
        NULL
    };
    execvp("ls",argv);
    exit(1);
}
void Child5(){
    printf("I am child5, I show execle\n");
    char* const envp[] = {
        "HAHA = 1111111",
        "HEHE = 2222222",
        NULL 
    };
    execle("/home/lxs/c/execl/test","test",NULL,envp);

    exit(1);
}
void Child6(){
    printf("I am child6, I show execvpe\n");
    char* const argv[] = {
        "test",
        NULL
    };
    char* const envp[] = {
        "HAHA = 1111111",
        "HEHE = 2222222",
        NULL 
    };
    execvpe("./test",argv,envp);
    exit(1);
}



int main(){
    pid_t num[10];
    num[1] = fork();
    if(num[1] == 0){
        Child1();
    }
    sleep(1);

    num[2] = fork();
    if(num[2] == 0){
        Child2();
    }
    
    sleep(1);
    
    num[3] = fork();
    if(num[3] == 0){
        Child3();
    }
    sleep(1);
    num[4] = fork();
    if(num[4] == 0){
        Child4();
    }
    sleep(1);
    num[5] = fork();
    if(num[5] == 0){
        Child5();
    }
    sleep(1);
    num[6] = fork();
    if(num[6] == 0){
        Child6();
    }
    sleep(1);

    int stat = 0;
    for(int i = 1;i<=6;i++){
        pid_t rid = waitpid(num[i],&stat,0);
        if(rid > 0){
            printf("wait child%d sucess,childexit code:%d\n",i,WEXITSTATUS(stat));
        }
    }
}

运行结果

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值