【Linux】进程控制——程序替换

文章目录

  • ✅1.复习
  • ✅2.学习程序替换
    • 2.1.替换原理
    • 2.2.替换函数
    • 2.3.函数解释
    • 2.4.命名理解
    • 2.5.如何替换
    • 2.6.exec举例
    • 2.7.图解
  • ✅3.练习题
    • 第一题(多选)
    • 第二题(单选)
    • 第三题(多选)

✅1.复习

每日一问,今天也要好好复习‍♀️

进程控制——深刻理解进程创建
进程控制——进程终止的三种方法
进程控制——进程等待
进程等待2.0,如何获取子进程的status

✅2.学习程序替换

【Linux】进程控制——程序替换_第1张图片

2.1.替换原理

  • fork创建子进程后执行的是和父进程相同的程序,但是有可能执行不同的代码分支
  • 子进程往往要调用一种exec函数以执行另一个程序,当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行
  • 调用exec并不创建新进程,所以调用exec前后该进程的id并未改变
    【Linux】进程控制——程序替换_第2张图片

2.2.替换函数

总共有六种函数,都是以exec开头的,统称为exec函数

int execl(const char *path, const char *arg, ...);//...代表不定参数
int execp(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[], ...);
int execve(const char *path, const char *argv[], char *const envp[]);

2.3.函数解释

  • 这些函数如果调用成功则加载新的程序,从启动代码开始执行,不在返回
  • 如果调用出错则返回-1
  • 所以exec函数只有出错的返回值而没有成功的返回值

2.4.命名理解

这些函数长得很像,容易混淆,需要掌握好规律记住
分为两大类,execlexecv

l:说明当前函数是 可变参数列表的函数

  • 1如果函数名称当中带有p:则表示会去搜索环境变量PATH来查找待替换的程序
  • 2如果函数名称当中不带有p:则表示不会去搜索环境变量,需要程序员自己指定待替换的程序的路径
  • 3如果函数名称中带有e:表示程序员需要自己组织环境变量

v:说明当前函数是以字符指针数组的方式来进行传递参数的

  • 1如果函数名称当中带有p:则表示会去搜索环境变量PATH来查找待替换的程序
  • 2如果函数名称当中不带有p:则表示不会去搜索环境变量,需要程序员自己指定待替换的程序的路径
  • 3如果函数名称中带有e:表示程序员需要自己组织环境变量
函数名 参数格式 是否带路径 是否使用当前环境变量
execl 列表 不是
execlp 列表
execle 列表 不是 不是,必须自己组装环境变量
execv 数组 不是
execvp 数组
execve 数组 不是 不是,必须自己组装环境变量

2.5.如何替换

加载一个新的程序到内存中,将当前的PCB的映射指向这个新的程序,调度这个新程序的运行

  • 程序替换就是给一个进程替换一个新的要调度运行的程序,并且因为这个进程调度的程序已经替换,因此当运行完毕新的程序后就会退出,原先的程序在替换之后的代码都不会被运行到,
  • 替换之后相当于没有当前的代码了,只有新的程序

2.6.exec举例

#include 
int main()
{
	char *const argv[] = {"ps", "-ef", NULL};
	char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL);
	execl("/bin/ps","ps","--ef",NULL);
	//带p的,可以使用环境PATH,无需写全路径
	execlp("ps","ps","-ef", NULL);
	//带e的,需要自己组装环境变量
	execle("ps", "ps", "-ef", NULL,envp);
	execv("/bin/ps", argv);
	//带p的,可以使用环境变量PATH,无需写全路径
	execve("ps", argv);
	//带e的,需要自己组装环境变量
	execve("bin/ps", argv, envp);
	exit(0);
}

2.7.图解

事实上只有execve是真正的系统调用,其他五个函数都是库函数,最终都调用execve,所以execve在man函数的第2节,其他函数在man的第3节,下图展示这些函数之间的关系
【Linux】进程控制——程序替换_第3张图片


✅3.练习题

第一题(多选)

‍通过fork和exec函数系统调用可以产生新进程,下列有关fork和exec系统调用说法正确的是()

A.fork生成的进程是当前进程的一个相同副本
B.fork系统调用与clone系统调用的工作原理基本相同
C.exec生成的进程是当前进程的一个相同副本
D.exec系统调用与clone系统调用的工作原理基本相同

正确答案

A B

第二题(单选)

‍一下描述正确的是()

A.execl函数可以直接指定可执行程序问价名称而不需要路径
B.execle函数可以直接指定可执行程序问价名称而不需要路径
C.execl函数和execle函数的区别是是否自定义设置环境变量
D.execl函数和execlp函数的区别是是否自定义设置环境变量

正确答案

C

第三题(多选)

‍以下描述正确的有()

A.程序替换成功后,运行完新程序依然会运行原有代码
B.程序替换成功后,运行完新程序,则程序退出
C.程序替换成功后,原程序退出,创建新进程运行新程序
D.程序替换成功后,原程序没有退出,使用原进程运行新程序

正确答案

B D

你可能感兴趣的:(Linux,linux,运维,服务器)