怎么实现进程替换

当没有指定查找路径时
Windows 会默认在当前路径下查找
Linux 默认在系统规定的目录(规定的目录是在PATH里边写死的)去查找,是不会在当前路径里边查找的
要想在当前目录下查找,必须把当前路径配到PATH里边去

如何将进程的空间的替换掉?------加载程序
加载器----exec系列的函数----将磁盘中的内容映射到内存中

exec系列函数的原型


int execve(const char* filename , char* const argv[] , char* const envp[]);
        ------操作系统只提供了这一个函数,其他的都是C语言库在它的基础上封装的。

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 ,const char*  argv[]);
int execvp(const char* file,const char*  argv[])

execl/execv          函数名中带p的是file ,因为那个p 就是path,代表文件路径
execlp/execvp      函数名不带p的是path,不仅要给出文件,还要给出文件里的路径。

execl ----不带e会将当前的进程的环境变量拿去用
execle ----e代表环境变量  不要原来的环境变量,要自己组装环境变量

如果既想使用execle 又想使用当前进程的环境变量,怎么实现呢?

系统里边定义了一个全局变量:char** environ   
可以使用 extern  char** environ  ,然后通过environ访问系统的环境变量

#include <stdio.h>
#include <stdlib.h> 
#include <unistd.h>
#include <string.h>

extern char* environ
int main()
{
        int i =0;
        for(i = 0; environ[i] != NULL ;i++)
            printf("%s\n",environ[i]);
        if(execle("./hello","hello",NULL,environ ) == -1)
            perror("exec"),exit(1);
}


这样一系列函数的使用都差不多,在这里就演示一下 execvp 的使用

为了方便验证,在这里将替换程序写简单一点。


被替换的程序




从结果可以看出,exec.c里边的 after execvp 并没有输出,这是为什么呢?
因为execvp函数已经使用可执行程序hello将后边的内容替换掉了。
如果替换失败,返回-1,后续代码依然会继续执行
exec系列函数

注:在哪个进程里边调用了exec就替换哪个进程的空间,并不需要创建一个子进程。
exec系列函数执行失败返回-1,原空间里边的内容会继续执行
执行成功地话是不会返回的,因为原来的空间已经被替换掉了,返回也没地接收了,所以不返回。
执行成功是不会返回的,因为执行成功了的话,原来的代码都不存在了,返回值也没地接收了,所以不返回。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值