目录

exec函数族

让父子进程执行不相干的操作

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

能够替换进程地址空间中的源代码.txt段

当前程序中调用另外一个应用程序

是否需要exec函数族判断: 首先考虑exec之前需要fork

返回值: (1) 如果函数执行成功, 不返回; (2) 执行失败, 打印错误信息, 退出当前进程

头文件: #include <unistd.h>

系统环境变量: extern char **environ;

执行指定目录下的程序

int execl(const char *path, const char *arg, ...); 常用
一般执行自己写的程序
参数:
  path: 要执行的程序的绝对路径
  变参args: 要执行的程序的需要的参数
    第一arg: 占位, 任意, 不能为空, 一般写执行程序名
    后边的arg: 命令的参数
    参数写完之后: NULL

execl("/home/robin/a.out", "a.out", NULL);

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

char* argv[] = {"a.out", NULL};
execv("/home/robin/a.out", argv);

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

int execlp(const char *file, const char *arg, ...); 常用
执行系统自带的程序, 即不需用绝对路径
参数:
  file: 执行的命令的名字
  变参arg:
    第一arg: 占位
    后边的arg: 命令的参数
    参数写完之后: NULL
    execpl执行自定义的程序: file参数绝对路径
示例

execlp("ls", "ls", "-la", NULL);

int execvp(const char *file, char *const argv[]);
示例

char* arg[] = {"ls", "-a", "-l", NULL};
execvp("ls", arg);

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

int execle(const char *path, const char *arg, ..., char * const envp[]);
从用户指定的目录中搜索指定的命令
参数:
  path: 执行的程序的绝对路径
  arg: 执行的程序的参数
  envp: 用户自己指定的搜索目录, 代替PATH
示例

char* env[] = {"/bin", "./", "/home/robin", NULL};  // 自己指定环境变量,对应PATH
execle("/bin/ls", "ls", "-l", "-a", NULL, env);

int execve(const char *filename, char *const argv[], char *const envp[]);
示例

char* argv[] = {"ps", "a", "u", "x", NULL};
char* env[] = {"/bin", "/home/", "./", NULL};
execve("/bin/ps", argv, env);

实例程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    pid_t pid;

    pid = fork();
    if(pid == -1) {
        perror("fork");
        exit(1);
    }

    if(pid == 0) {
        // 子进程执行另外一个程序
#if 0
// ++++++++++++++++++++ execl ++++++++++++++++++++
/*
 * int execl(const char *path, const char *arg, ...);
        函数描述:加载一个进程,通过路径 + 程序名来加载。
        函数参数:
            path:程序路径+程序名字
            arg:可执行程序的相关参数,使用NULL结尾
        返回值:
            成功:无返回
            失败:-1
 */
        // 子进程执行指定目录下的自己编写的程序,该程序参数
        printf("this is func +++++++++ execl +++++++++\n");
        execl("/home/robin/a.out", "a.out", NULL);
        // 如果执行成功没有返回值
        perror("execl");
        exit(1);
#endif

#if 0
// ++++++++++++++++++++ execlp ++++++++++++++++++++
/*
 * int execlp(const char *file, const char *arg, ...);
        函数描述:加载一个进程,借助PATH环境变量,该函数需要配合PATH环境变量来使用,
                          当PATH中所有目录搜索后没有参数1则出错返回
        函数参数:可执行程序的相关参数,使用NULL结尾
            file:可执行程序的名字
            arg:可执行程序的相关参数,使用NULL结尾
        返回值:
            成功:无返回
            失败:-1
 */
        printf("this is func +++++++++ execlp +++++++++\n");
        execlp("ls", "ls", "-la", NULL);
        // 如果执行成功没有返回值
        perror("execlp");
        exit(1);
#endif

#if 0
// ++++++++++++++++++++ execvp ++++++++++++++++++++
/*
 * int execvp(const char *file, char *const argv[]);
        用法同 execlp
 */
        printf("this is func +++++++++ execvp +++++++++\n");
        char* arg[] = {"ls", "-a", "-l", NULL};
        execvp("ls", arg);
        // 如果执行成功没有返回值
        perror("execvp");
        exit(1);
#endif

#if 0
// ++++++++++++++++++++ execle ++++++++++++++++++++
/*
 *   int execle(const char *path, const char *arg, ..., char *const envp[]);
 *      从用户指定的目录中搜索指定的命令
 */
        printf("this is func +++++++++ execle +++++++++\n");
        char* env[] = {"/bin", "./", "/home/robin", NULL};  // 自己指定环境变量,对应PATH
        execle("/bin/ls", "ls", "-l", "-a", NULL, env);
        // 如果执行成功没有返回值
        perror("execle");
        exit(1);
#endif

#if 0
// ++++++++++++++++++++ execv ++++++++++++++++++++
/*
 *  int execv(const char *path, char *const argv[]);
 *      用法同:execl
 */
        printf("this is func +++++++++ execve +++++++++\n");
        char* argv[] = {"a.out", NULL};
        execv("/home/robin/a.out", argv);
        // 如果执行成功没有返回值
        perror("execv");
        exit(1);
#endif

#if 1
// ++++++++++++++++++++ execve ++++++++++++++++++++
/*
 *  int execve(const char *path, char *const argv[], char *const envp[]);
 */
        printf("this is func +++++++++ execve +++++++++\n");
        char* argv[] = {"ps", "a", "u", "x", NULL};
        char* env[] = {"/bin", "/home/", "./", NULL};
        execve("/bin/ps", argv, env);
        // 如果执行成功没有返回值
        perror("execve");
        exit(1);
#endif
    }

    else if(pid > 0)
        printf("parent process +++++++++++++++++++\n");
    printf("*****************************\n");

    return 0;
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄