进程创建-终止-等待-替换
文章目录
- 进程创建
- 进程终止
- 进程等待
- 进程替换
进程创建
意义:
进程运行时常会出现崩溃,为了避免父进程出现奔溃,则会创建子进程去代替父进程处理事务,即使崩溃并不会影响到父进程的正常运行,再创建一个子进程再次处理罢了。
用法:(man命令查相关命令及函数的具体用法)
fork() | 创建子进程,父子进程虚拟地址空间独立 |
---|---|
vfork() | 创建子进程,并阻塞父进程,父子进程同用一块虚拟地址空间 |
返回值:子进程返回0;父进程返回子进程pid;出错返回-1
阻塞父进程:因为子进程和父进程分配到CPU的可能性是一样的,所以子进程与父进程谁先运行难以确定。但经过阻塞父进程后,子进程便先于父进程获取到CPU。
为什么要阻塞父进程:因为使用vfork()函数创建子进程时,父子进程共用同一块虚拟地址空间,因此共用同块栈去,如果不进行阻塞,会出现栈混乱的现象。
上一篇文章分析了进程创建的原理,链接如下:
https://blog.csdn.net/qq_44768163/article/details/115014661
进程终止
方法 | 接口 | 头文件 | 区别 |
---|---|---|---|
exit | 库函数调用接口 | <stdlib.h> | 退出后刷新缓冲区 |
_exit | 系统调用接口 | <unistd.h> | 退出后并不刷新缓冲区 |
return | 只能在main中使用 | --------- | 退出后刷新缓冲区 |
具体执行流程如下:
- printf打印的内容读入缓冲区
- 进入fun函数,退出调用该函数的的进程,并刷新缓冲区,输出------
- 使用echo $? 获取返回值99
注:缓冲区的存在避免了频繁操作输出设备,使得输入内容存满后,再刷新缓冲区。。
进程等待
概念:
父进程等待子进程退出,获取退出子进程的退出返回值,释放子进程资源,避免产生僵尸进程。
方法:
wait方法:(等待任意一个子进程退出)
返回值:成功- ->返回被等待进程pid;失败- ->返回-1;
参数:获取子进程退出状态- ->int *status;不关心子进程退出状态- ->置为NULL
waitpid方法:(等待任意一个子进程退出或等待一个指定的子进程退出)
返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(用来查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零(正常终止),提取子进程退出码。(用来查看进程的退出码)
options:
0:表示默认阻塞等待
WNOHANG: 设置为非阻塞等待
阻塞等待:为了完成一个功能,发起调用,若当前不具备完成条件,则一直等待。
非阻塞等待:为了完成一个功能,发起调用,若当前不具备完成条件,则报错返回。eg:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。
实验:
wait方法
正常退出运行结果:
异常退出运行结果:(使用kill强杀依然属于正常退出,这里通过不创建子进程再等待即可模拟出等待失败返回-1的场景)
waitpid方法:
正常退出:
异常退出:
获取子进程的status
进程替换
其实有六种以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 execve(const char *path, char *const argv[], char *const envp[]);//系统调用函数
参数说明:
第一个参数:新的程序文件路径名
第二个参数:程序的运行参数
第三个参数:程序的环境变量
实验:
总结:
有没有p的区别:
在于程序文件是否需要带路径,有p时可以不带路径,但前提是该程序文件必须在PATH环境变量指定路径下。
有没有e的区别:
在于程序是否自己设定环境变量,有e时自己设定环境变量(覆盖式设定,将之前已有的环境变量覆盖),没有e时,使用默认已有的环境变量。
l和v的区别:
在于程序运行参数的赋予方式不同,l是一一列举传入,v是将运行参数列入数组中,整体传入
上图是进程替换的几种实现方式,分别对已有的ls程序文件和自定义实现的arg.c文件进行了替换实现,结果。。。。。。。。
进程创建-终止-等待-替换相关推荐
- 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》
前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...
- 【Linux】进程控制 —— 进程创建/终止/等待
目录 一.进程创建 1.fork创建子进程,操作系统做了什么? 2.fork的用法以及失败的原因 二.进程终止 1.三种退出情况 2.main函数为什么一般情况下都要return 0 3.进程的退出码 ...
- c语言进程创建、等待和退出
c语言进程创建.等待和退出 创建进程 fork()函数:函数返回值类型为pid_t 若程序运行在父进程中,函数返回的PID为子进程今年称号: 弱运行在子进程中返回PID为0. #include < ...
- Linux 进程控制(创建/退出/等待/替换)
目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...
- Linux 进程控制 :进程创建,进程终止,进程等待,程序替换
进程创建 进程终止 进程等待 程序替换 进程创建 fork函数 创建一个子进程,父子进程代码共享,数据独有 #include <unistd.h> pid_t fork(void); 返回 ...
- Linux-进程控制详解(进程创建+进程终止+进程等待+进程程序替换)
Linux进程控制 1. 进程创建 1.1 fork 1.2 vfork 2. 进程终止 3. 进程等待 3.1 为什么要进程等待 3.2 wait 3.3 waitpid 3.4 获取子进程退出信息 ...
- 【Linux】linux进程--进程控制:进程创建、进程终止、进程等待、进程程序替换
目录 1.进程创建 1)重温fork():让正在运行的进程创建出来一个子进程:从已存在的进程中创建一个新的进程,新进程为子进程而远进程为父进程. 2)fork内部完成的事情 3)用户空间 & ...
- Linux:进程管理 | 进程创建 | 进程终止 | 进程等待 | 进程替换
文章目录 进程创建 fork 写时拷贝机制 进程终止 退出码 进程退出方法 进程等待 阻塞.非阻塞的等待 进程替换 替换函数 exec l exec lp exec le exec ve exec v ...
- 【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)
文章目录 一.进程创建 1.1 系统调用 fork 1.2 理解 fork 的返回值 1.3 写时拷贝策略 二.进程终止 2.1 main 函数的返回值 2.2 进程退出的几种情况 2.3 进程退出码 ...
最新文章
- Sublime3快捷键大全
- ceph osd跟cpu进行绑定
- H5+JS+相对单位rem实现第三方支付页(输入金额+模拟数字键盘+自适应布局+大写金额)
- P2754 [CTSC1999]家园 / 星际转移问题(网络流)
- 金融时间序列计算分析题1
- java sender_Spring Boot用JavaMailSender发送邮件方法
- python plot linestyle 线型颜色及线条控制(linestyle、marker、color)
- [字符串]ASCII码表
- 【IoT】 产品研发:位深为1的BMP格式图片详解
- cityscape train.txt 数据 python读取子文件夹内所有文件
- 浏览器播放m3u8文件
- 期货手续费怎么计算?
- windows打印机 学习
- ubuntu14.04搜狗输入法中文无法切换英文
- 游戏手柄计算机,电脑游戏手柄怎么设置 电脑游戏手柄设置步骤【图文】
- MPLAB程序中如何设置配置字
- CodeForces - 89A - Robbery
- 广州土地市场有所回暖?分析广州房价,看看有什么新发现
- 你是弱者,又有什么了不起
- wrl文件转换成obj文件