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

作者 : admin 本文共2015个字,预计阅读时间需要6分钟 发布时间: 2024-06-10 共3人阅读

execl族函数的作用

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

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

mytest.c

#include 
#include 

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

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

text.py

print("I am Python!!")

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

LINUX—-进程替换,exec族函数插图

exec族函数详解

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

#include 
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 
#include 
#include 
#include 
#include 
void Child1(){
    printf("I am child1, I show execl
");
    execl("/usr/bin/ls","ls","-a","-l","--color",NULL);
    exit(1);
}
void Child2(){
    printf("I am child2, I show execv
");
    char* const argv[] = {
        "ls",
        "-a",
        "-l",
        "--color",
        NULL
    };
    execv("/usr/bin/ls",argv);
    exit(1);
}
void Child3(){
    printf("I am child3, I show execlp
");
    execlp("ls","ls","-a","-l","--color",NULL);
    exit(1);
}
void Child4(){
    printf("I am child4, I show execvp
");
        char* const argv[] = {
        "ls",
        "-a",
        "-l",
        "--color",
        NULL
    };
    execvp("ls",argv);
    exit(1);
}
void Child5(){
    printf("I am child5, I show execle
");
    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
");
    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 0){
            printf("wait child%d sucess,childexit code:%d
",i,WEXITSTATUS(stat));
        }
    }
}

LINUX—-进程替换,exec族函数插图(1)

运行结果

LINUX—-进程替换,exec族函数插图(2)

LINUX—-进程替换,exec族函数插图(3)

本站无任何商业行为
个人在线分享 » LINUX—-进程替换,exec族函数
E-->