• exec函数族


    进程程序替换

    • 进程程序替换原理

    fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程就会从新程序的启动历程开始执行。在这个过程中没有创建新进程,所以调用exec并没有改变进程的id。

    • 替换图解(图解)

    exec函数族

    1. 执行指定目录下的程序

    int execl(const char *path, const char *arg, ...);

    分析:

    • path: 要执行的程序的绝对路径
    • 变参arg: 要执行的程序的需要的参数
    • 第一arg:占位
    • 后边的arg: 命令的参数
    • 参数写完之后: NULL
    • 一般执行自己写的程序

    2. execv函数原型:

    int execv(const char *path, char *const argv[]);

    分析:

    • path = /bin/ps
    • char* args[] = {"ps", "aux", NULL};
    • execv("/bin/ps", args);

    3. 执行PATH环境变量能够搜索到的程序

    int execlp(const char *file, const char *arg, ...);

    分析:

    • file: 执行的命令的名字
    • 第一arg:占位
    • 后边的arg: 命令的参数
    • 参数写完之后: NULL
    • 执行系统自带的程序
    • execlp执行自定义的程序: file参数绝对路径

    注意:如果file中包含/,则将其视为路径名,否者就按PATH环境变量,在它指定的各目录中搜可执行文件

    4. execvp函数原型:

    int execle(const char *path, const char *arg, ..., char *const envp[]);

    5. 执行指定路径, 指定环境变量下的程序

    int execle(const char *path, const char *arg, ..., char *const envp[]);

    分析:

    • path: 执行的程序的绝对路径  /home/itcast/a.out
    • arg: 执行的的程序的参数
    • envp: 用户自己指定的搜索目录, 替代PATH
    • char* env[] = {"/home/itcast", "/bin", NULL};

    6. execve函数原型:

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

    二、代码清单

    1. 测试代码:

     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4  
     5 int main()
     6 {
     7     for(int i = 0; i < 8; ++i)
     8         printf(" parent i = %d
    ", i);
     9     pid_t pid = fork();
    10     if(pid == 0) 
    11     {
    12         execlp("ps", "ps", "aux", NULL);
    13         perror("execlp");
    14         exit(1);
    15     }
    16     for(int i = 0; i < 3; ++i)
    17         printf("----------- i = %d
    ", i);
    18     return 0;
    19 }

    输出结果:

    参考资料

  • 相关阅读:
    Stimulsoft Reports筛选数据来绑定显示2个报表
    随便写点吧
    盒模型、文档流
    css选择器、权重
    css3转换
    html
    css新起点
    css里的那些事儿
    【谭老师讲堂】零基础如何学好Java——交流
    【谭老师讲堂】零基础如何学好Java——棒棒糖
  • 原文地址:https://www.cnblogs.com/sunbines/p/10269190.html
Copyright © 2020-2023  润新知