进程程序替换

进程程序替换并没有创建新的进程
怎么样才算是新建了一个进程?
创建好task_struct,再把task_struct插到双向链表里面,这才是创建好了一个进程。

所谓的进程程序替换就是把物理内存上的数据和代码替换成了另外一个磁盘上的可执行文件的数据和代码,说白了,我们前面写的一些程序都是把它编译成一个可执行程序,一个可执行文件,而这个可执行文件非得是通过“./文件名”的方式才能把它运行起来,这样一个运行的过程其实就是由操作系统把这个文件里面包含的数据和代码加载到内存中的过程,进程程序替换它的这个替换和运行一个程序它的一个加载过程是非常类似的,意思是我们本来就有一个进程,然后这样一个进程它有自己的代码和数据,但是我想借助这个进程能够去执行另外一个可执行文件中的代码,就可以通过程序替换的方式来完成这一项操作。
所以说,进程程序替换是将原有进程的代码和数据替换成新的可执行程序的代码和数据。
在这里插入图片描述
exec函数族头文件都是unistd.h
如果调用成功则加载新的程序从启动代码开始执行,不再返回;如果调用出错则返回 -1。
1、execl(l指list,可变参数列表)
int execl(const char *path, const char *arg, …);
其中,参数1表示路径,就是你要替换的那个可执行程序的那个可执行文件它的路径是什么;
后面是一个变长参数列表,表示你要替换的那个可执行程序在启动的时候要加上哪些的命令行参数。
由于行参数到底有几个这个不确定,所以通过变长参数列表的形式来提供给我们用户使用。

2、execlp(p表示的含义叫做环境变量PATH,表示PATH这个环境变量),p特指环境变量中的PATH,只是环境变量中的一个。
int execlp(const char *file, const char *arg, …);
PATH里面的内容是一组路径,这组路径是用来,当我们在终端下敲下一个指令的时候,其实是要运行一个可执行文件,那这可执行文件在哪个目录下去查找它,就在PATH包含的路径中去查找。
execlp意思是你在告诉程序调用哪一个可执行文件的时候,你不需要写全路径,只写文件名就可以。
其中,参数1只写一个文件名就行,文件名怎么映射到具体的完整路径上,自动地从PATH中进行查找。只要告诉文件名,就能自动地找到它的路径。如果这个文件不在 PATH 下,那就需要指定路径了,相对路径或者绝对路径均可以。

3、execle(e表示的叫做环境变量),e代表着整体环境变量这个大的概念。
int execle(const char *path, const char *arg, … , char *const envp[]);
借助这个函数,可以让调用者去手动设置即将要替换好的这个程序它的环境变量应该长成什么样子,所以有envp[ ]这个参数,这样的一个参数里面就包含了若干的环境变量,那也就是说在调用这个函数的时候,就可以手动构造出一个环境变量的数组来,然后把这个数组配置进去,那么当进程程序替换完毕后,替换好的进程它的环境变量表就变成了刚刚配置好的这样一个内容,即允许用户手动设置环境变量。

4、execv(v表示vector,数组)
int execv(const char * path, char *const argv[]);
execv这三个函数都是通过argv[ ]的形式来组织若干个命令行参数的

5、int execvp(const char *file, char *const argv[]);

6、execve是系统调用,其余5个都是库函数,都是基于execve系统调用来实现的。
man第一页是用户指令,第二页是系统调用,第三页是库函数。
int execve(const char *path, char *const argv[], char *const envp[]);

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值