Linux:Linux:进程终止和进程替换
一、进程终止
1.1 进程退出场景和创建退出方式
进程退出有3种场景:代码执行完毕,结果正确;代码执行完毕,结果错误;代码异常终止!
而进程退出的常见方式主要分为以下两大类:
| 正常终止 | |
| 从main返回 | |
| 调用exit退出 | |
| 调用_exit退出 | |
| 异常终止 | ctrl c, 信号终止 |
1.2 exit 和 _exit区别
exit 和 _exit都可以直接终止进程。但_exit是系统调用接口,而exit为函数调用,底层封装了exit。
不同的是,exit终止进程时,会刷新缓冲区,执行用户的清理函数,关闭流等操作;而_exit则是直接“粗暴”的退出进程,不做任何其他工作!!

二、进程程序替换
fork()创建子进程时,子进程执行的代码和数据都是父进程的一部分。如果我们想让子进程执行全新的代码,访问全新的数据,我们可以采用一种技术 —— 程序替换!而进程替换可以将命令行参数和环境变量传递给被替换程序的main()函数参数!!
2.1 进程替换函数
进程替换函数有6种以exec开头的函数,统称为exec函数。
#include <unistd.h>
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, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
而exec函数底层都封装了系统调用接口execve的疯转,以实现不同的需求!
#include <unistd.h>
int execve(const char *filename, char *const argv[], char *const envp[]);
2.2 函数解释及命名解释
函数解释
- 如果这些函数调用成功,也就意味着进程替换成功。此时重新加载新的程序,从启动代码开始执行,并且不再返回。即进程替换后,执行新程序,执行完后直接退出!!
- 如果进程替换函数执行失败,此时返回值设为-1。
- exec函数只有出错的返回值,没有成功的返回值。
命名解释
- l(list):参数采用列表形式。
- v(vector):参数采用数组。
- p(path):带p表示执行程序时,OS会自带去环境变量PATH中查找路径。
- e(env):表示自己维护环境变量。
2.3 单进程程序替换(无子进程)
2.3.1 带l函数进程替换(execl为例)
下面我们在一段代码的开头和结尾分别输出打印相关信息,然后两段信息输出代码直接调用execl替换ls -a-l。
【源代码】:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

最低0.47元/天 解锁文章
565





