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));
        }
    }
}

运行结果

相关推荐

  1. <span style='color:red;'>exec</span><span style='color:red;'>族</span>

    exec

    2024-06-10 05:08:03      22 阅读
  2. 进程替换exec系列介绍

    2024-06-10 05:08:03       22 阅读
  3. Linux exec 命令和Python exec 函数 区别

    2024-06-10 05:08:03       8 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 05:08:03       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 05:08:03       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 05:08:03       4 阅读
  4. Python语言-面向对象

    2024-06-10 05:08:03       6 阅读

热门阅读

  1. Linux中 .PHONY 和 all 在 Makefile 中的作用

    2024-06-10 05:08:03       17 阅读
  2. C++预编译、编译、链接

    2024-06-10 05:08:03       19 阅读
  3. 窗帘怎么选好看不踩坑

    2024-06-10 05:08:03       20 阅读
  4. netty-学习

    2024-06-10 05:08:03       16 阅读
  5. Sylar---协程调度模块

    2024-06-10 05:08:03       13 阅读
  6. Redis命令实践

    2024-06-10 05:08:03       14 阅读
  7. C#根据反射生成sql语句(Update语句)

    2024-06-10 05:08:03       16 阅读
  8. HTTP-一

    HTTP-一

    2024-06-10 05:08:03      15 阅读
  9. 洛谷 P2926:轻拍牛头 ← 模拟题

    2024-06-10 05:08:03       15 阅读
  10. 自然语言处理(NLP)—— 自动摘要

    2024-06-10 05:08:03       19 阅读
  11. 我已经入驻@面包多平台

    2024-06-10 05:08:03       17 阅读
  12. # Mac环境如何安装Flutter:全面指南

    2024-06-10 05:08:03       20 阅读