Linux --- 进程控制(内含思维导图)

一、进程等待

1.1 目的
创建子进程的目的是为了让他去完成一些任务,当他退出时候,为了让父进程获取结果,不会直接退出,而是进入僵尸状态,如果不及时回收,会出现内存泄漏问题。所以进程等待的目的有两个 一、获取子进程退出码或者子进程出现异常时候的信号。(看需求)二、回收空间,防止内存泄漏(必须)。
1.2 手段
使用系统调用 — wait/waitpid, 只介绍waitpid,会waitpid 也就会wait。
在这里插入图片描述

第一个参数:pid>0 指定要等待的子进程,pid = -1 为任意一个子进程,等价于wait
第二个参数:获取子进程退出码或者信号,一个int类型怎么接受退出码或者信号,因此出现用位来表示子进程退出码或者信号。方法一: 获取信号: status&0x7f 、获取退出码:(status>>8)&0xff。方法二:
调用相应的宏:获取信号:WIFEXITED(status) 获取退出码:WEXITSTATUS(status)。
第三个参数:为0时,父进程会一直等待直到退出,这使得父进程处于阻塞状态,会链入子进程的相应字段,直到被OS唤醒加入运行队列。为WNOHANG时,父进程会处于轮询状态,通过判断waitpid返回值,为0时代表子进程未退出,则父进程会完成自己的任务,不断重复这样的动作直到返回子进程pid代表子进程退出,回收成功。

在这里插入图片描述


二、进程替换

2.1 目的
为了让创建出来的子进程执行新的程序

2.2 手段
通过以下几个函数完成进程替换:
在这里插入图片描述
execv 与 execl 区别:execl 使用的是可变参数,将命令与选项一个一个传给execl,例如 “/bin/ls” “ls” “-a” “-l”,而 execv 传的是指针数组,通过下标解引用数组分别存放指令、选项,因此 l 是List的意思,而 v 是vector的意思。
execl 与 execlp 区别: 多了一个p,execl 第一个参数是传绝对路径,而 execlp 第一个参数是文件,在调用的时候通过在环境变量PATH中寻找
execl 与 execle 区别:相比之下 execle 要多传一个环境变量数组,且被调用程序采用的是这个环境变量数数组,会将原来的环境变量覆盖。
以上这六个函数实际上是对该系统调用 execve 进行了封装,实现接口更加丰富来满足开发人员的需求。

注意点: 当运行这些函数时,会将子进程的代码进行覆盖(修改),页表映射与父进程相同,这时会发生写时拷贝,同时证明写时拷贝不一定是只发生在数据上。所以一般是不通过返回值来判断是否函数执行成功,而是在下面写exit(-1)这样终止进程,因为执行失败就会接着执行原来的代码。


三、进程终止

3.1 进程终止情况
先介绍一下退出码,如:main函数每次最后都会return 0,这就是退出码,代表含义为执行到这里程序执行成功,且结果正常,因此我们可以通过 return 来设计程序,运行出你预期的结果,return 你觉得表示成功的数字,如0。运行出不是预期的结果,return -1 2 3等代表错误的码。

拓展 在Linux中通过echo $? 获取最近一次的进程退出码,且退出码还是不容易理解,我们可以通过perro errorno等对退出码进行翻译,达到一目了然的效果。例如:ls 找不到文件便是通过这样的手段来实现的。
在这里插入图片描述

进程终止有以下三种情况:1、 执行成功了,返回结果正常。2、 执行成功了,返回结果错误。3.2、 代码有问题,直接报错(是OS给该进程发送信号从而终止进程)。
前面两种情况是通过退出码来区分,第三种情况是通过信号来终止进程表示异常。 所以父进程查看子进程任务完成情况是通过退出码 + 信号这样的手段实现。

3.3 手段
除了上面所提的main函数通过返回return 来返回结果,还可以调用exit函数来进行进程终止。他与return不同是在任意函数调用都可直接终止进程,而return只能在main函数才能终止进程。且他底层是对系统调用 _exit()封装。属于上下层关系。他们两个区别如图所示。因此更加推荐exit函数

请添加图片描述

思维导图

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值