Linux进程替换——进程执行其它代码的方式

  程序是代码和数据的集合;程序可以作为对象模块存在于磁盘上,也可以作为地址空间中的段存在。进程是正在执行的程序的特定实例;程序总是在某个进程的上下文中运行。进程替换函数在当前进程的上下文中加载并运行新程序。虽然它会覆盖当前进程的地址空间,但不会创建新进程。新程序仍然具有相同的PID,并且它继承了调用进程替换函数时打开的所有文件描述符。

进程替换函数有如下几个:

//C标准库提供的接口,#include <unistd.h>
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp[]*/);
int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);

int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);//这个是由操作系统提供的;其他由C库函数提供
int execvp(const char *file, char *const argv[]);

其中各个函数的名称可以按包含的字母解剖为:

  • l(list) :传参使用可变参数列表
  • v(vector):传参使用数组
  • p(path):传参指定程序路径
  • e(environment):指定进程运行的环境变量

具体例子:

//1 path:二进制文件所在的绝对路径;args:可变参数列表,以NULL结尾
execl("usr/bin/ls","ls","-a","-l",NULL);

//2 可以传入用户自定义的环境变量,这个函数替换了原来进程的环境变量;指针数组需要以NULL结尾
char *env[] = {
        "Modified Variable",
        NULL
    };
execle("./TestExecle", "TestExecle", NULL, env);

//3 只需给定二进制文件名就可以了(ls),会自动搜索环境变量找到ls的path。
execlp("ls", "ls", "-a", "-l",NULL);


//4
char *argv[] = {"ls", "-a", "-l", NULL};
execv("usr/bin/ls",argv);

//5 将list用数组表示即可
char *argv[] = {"TestExecle", NULL};
execve("./TestExecle", argv, env); 

//6
execvp("ls",argv);

下面给个关于execle的具体的实操:

// 新建源程序,文件名为:TestExecle.c
#include <stdio.h>

int main(int argc, char *argv[], char *env[])
{
    printf("I am TestExecle program\n");
    for(int i = 0; env[i]; i++)
    {
        printf("%s\n",env[i]);
    }
    return 0;
}


// 新建源程序,文件名为:main.c
#include <stdio.h>

int main()
{
    char *env[] = {
        "Modified Variable",
        NULL
    };
    
    //extern char **environ;
    //execle("./TestExecle", "TestExecle", NULL, environ); 完整打印也可这样操作
    execle("./TestExecle", "TestExecle", NULL, env);
    printf("hello world\n"); //程序替换之后,后续的代码不会执行
    return 0;
}
.PHONY:all
all:main TestExecle

main:main.c
	gcc -o $@ $^ -std=c99

TestExecle:TestExecle.c
	gcc -o $@ $^ -std=c99

.PHONY:clean
clean:
	rm -f main TestExecle
[test@VM-12-4-centos Execl]$ make
gcc -o main main.c -std=c99
gcc -o TestExecle TestExecle.c -std=c99
[test@VM-12-4-centos Execl]$ ./main  # main将自定义的环境变量传给了TestExecle;通过main函数运行结果可以验证
I am TestExecle program
Modified Variable
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值