每日一问,今天也要好好复习♀️
进程控制——深刻理解进程创建
进程控制——进程终止的三种方法
进程控制——进程等待
进程等待2.0,如何获取子进程的status
总共有六种函数,都是以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[]);
- 这些函数如果调用成功则加载新的程序,从启动代码开始执行,不在返回
- 如果调用出错则返回-1
- 所以
exec
函数只有出错的返回值而没有成功的返回值
这些函数长得很像,容易混淆,需要掌握好规律记住
分为两大类,execl
和execv
l
:说明当前函数是可变参数列表
的函数
- 1如果函数名称当中带有
p
:则表示会去搜索环境变量PATH
来查找待替换的程序- 2如果函数名称当中不带有
p
:则表示不会去搜索环境变量,需要程序员自己指定待替换的程序的路径- 3如果函数名称中带有
e
:表示程序员需要自己组织环境变量
v
:说明当前函数是以字符指针数组的方式
来进行传递参数的
- 1如果函数名称当中带有
p
:则表示会去搜索环境变量PATH
来查找待替换的程序- 2如果函数名称当中不带有
p
:则表示不会去搜索环境变量,需要程序员自己指定待替换的程序的路径- 3如果函数名称中带有
e
:表示程序员需要自己组织环境变量
函数名 | 参数格式 | 是否带路径 | 是否使用当前环境变量 |
---|---|---|---|
execl | 列表 | 不是 | 是 |
execlp | 列表 | 是 | 是 |
execle | 列表 | 不是 | 不是,必须自己组装环境变量 |
execv | 数组 | 不是 | 是 |
execvp | 数组 | 是 | 是 |
execve | 数组 | 不是 | 不是,必须自己组装环境变量 |
加载一个新的程序到内存中,将当前的PCB的映射指向这个新的程序,调度这个新程序的运行
- 程序替换就是给一个进程替换一个新的要调度运行的程序,并且因为这个进程调度的程序已经替换,因此当运行完毕新的程序后就会退出,原先的程序在替换之后的代码都不会被运行到,
- 替换之后相当于没有当前的代码了,只有新的程序
#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);
}
事实上只有execve是真正的系统调用,其他五个函数都是库函数,最终都调用execve,所以execve在man函数的第2节,其他函数在man的第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