博客
关于我
Linux:程序替换
阅读量:324 次
发布时间:2019-03-04

本文共 2212 字,大约阅读时间需要 7 分钟。

Linux程序替换

程序替换在Linux系统中是一种常见的操作方式,通过调用exec函数族,可以在现有进程中替换为新的程序。这种方式能够在不创建新进程的情况下,立即运行新的程序。

程序替换的核心原理是利用fork创建子进程后,调用exec函数将子进程的代码和数据替换为新的程序。虽然fork会创建新的进程,但调用exec后进程ID并不会改变,继续使用原有的进程空间。这使得程序替换成为在不影响现有进程情况下更换程序的有效手段。

替换方法

在Linux系统中,程序替换主要通过以下六种exec函数来实现:

#include 
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

这些函数的区别主要体现在参数格式和是否自定义环境变量等方面:

函数名 参数格式 是否带路径 是否使用当前环境变量
execl 列表形式 不是
execlp 列表形式
execle 列表形式 不是 不是(需要自己组装环境变量)
execv 数组形式 不是
execvp 数组形式
execve 数组形式 不是 不是(需要自己组装环境变量)

注意:这些函数调用成功后,会立即执行新的程序,不会返回任何值;如果调用失败,会返回-1。因此,在调用exec函数后,必须检查返回值是否为-1,否则可能导致程序无法正常退出。

函数规律

通过对这些exec函数的分析可以发现,主要有以下几个规律:

  • 参数格式的区别:execl和execlp接受列表形式的参数,而execv、execvp和execve接受数组形式的参数。
  • 路径的自动搜索:execlp会自动搜索PATH环境变量,找到程序的路径;而execl需要完全指定路径。
  • 环境变量的处理:execle和execve不使用当前进程的环境变量,需要自己组装环境变量;而其他函数会继承当前进程的环境变量。
  • 示例代码

    #include 
    #include
    #include
    int main() {
    pid_t pid = fork();
    if (pid < 0) {
    perror("fork");
    return -1;
    } else if (0 == pid) {
    char *const argv[] = {"ps", "-ef", NULL};
    char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
    if (execl("/bin/ps", "ps", "-ef", NULL) < 0) {
    perror("execl");
    }
    if (execlp("ps", "ps", "-ef", NULL, envp) < 0) {
    perror("execlp");
    }
    if (execle("ps", "ps", "-ef", NULL, envp) < 0) {
    perror("execle");
    }
    if (execv("/bin/ps", argv) < 0) {
    perror("execv");
    }
    if (execvp("ps", argv) < 0) {
    perror("execvp");
    }
    if (execve("/bin/ps", argv, envp) < 0) {
    perror("execve");
    }
    sleep(30);
    exit(0);
    } else {
    sleep(30);
    printf("子进程退出!\n");
    while (1) {
    printf("正在打麻将!\n");
    }
    }
    }

    在这个示例中,我们通过fork创建子进程,并在子进程中调用不同的exec函数来替换程序。每个函数都有不同的特点,例如execlp会自动搜索程序路径,而execve则需要自己组装环境变量。

    转载地址:http://xbmq.baihongyu.com/

    你可能感兴趣的文章
    nodejs 运行CMD命令
    查看>>
    Nodejs+Express+Mysql实现简单用户管理增删改查
    查看>>
    nodejs+nginx获取真实ip
    查看>>
    nodejs-mime类型
    查看>>
    NodeJs——(11)控制权转移next
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs下的express安装
    查看>>
    nodejs与javascript中的aes加密
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs中express的使用
    查看>>
    Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
    查看>>
    Nodejs中的fs模块的使用
    查看>>
    NodeJS使用淘宝npm镜像站的各种姿势
    查看>>
    NodeJs入门知识
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs在Liunx上的部署生产方式-PM2
    查看>>
    nodejs基于art-template模板引擎生成
    查看>>