进程终止与进程等待

进程终止

退出码

main函数的返回值可以由echo $?获取返回值

?:最近一个进程的退出码

​ ​

我们创建的子进程时为父进程办事的,他需要提供事情完成结果的信息,也就是下面3种情况

​​1.代码运行完毕,结果正确

 2.代码运行完毕,结果不正确

 3.代码异常终止

0->success

!0->Failed->我们需要知道这个进程为什么失败

1,2,3,4,5,6我们就可以用不同的数字表示不同原因

streeror

​​

错误码

errno

strerror(errno)

错误码与退出码

错误码通常是衡量一个库函数或操作系统调用函数的情况

退出码通常时一个进程退出的时候,它的退出结果

异常问题

异常时退出码没有意义,出现异常,操作系统会通过发信号终止进程

进程等待

1.什么是进程等待

通过wait/waitpid的方式,让父进程对子进程进行资源回收的等待过程

2.为什么要进行进程等待

a.解决子进程僵尸问题带来的内存泄漏问题--必须

b.子进程是要为父进程完成任务,子进程将任务完成的如何,需要进程等待的方式,获取子进程退出的信息--两个数字!--不是必须的,但是系统需要提供这样的基础功能

3.如何进行等待

wait

如果子进程根本没有退出,父进程必须在wait上进行阻塞等待,知道子进程僵尸,wait自动回收。

父进程并没有退出,而是进行了等待,当子进程退出时,立刻进行回收。

​ ​

一般而言,父子进程谁先运行我们不知道,但是最后一般都是父进程最后退出

waitpid

​ ​

如何去理解非阻塞?

如果我们等待的条件不满足,waitpid不阻塞,而是立即返回。

非阻塞等待,往往要进行重复调用,轮询+非阻塞进行进程等待 优点:等待的同时,可以做自己的事情

rid>0 等待成功

rid=0:等待是成功的,但是对方还没有退出

rid<0:等待失败

所以

for( )

{

if(rid>0) return 0;

else if(rid == 0) continue;

else printf("wait failed");

}

可以看到和wait同样的现象,但是子进程的退出码为10,返回的status信息却为2560?

提取status的错误信息

(status&0x7F)终止信号

(status>>8)&0xFF 退出信号

1.当一个进程异常了(收到信号),exit code还有意义吗? 没有

2.有么有收到信号如何判定?exit sign:!0

父进程如何得知子进程的退出信息呢?在系统层面

子进程在退出的时候,要修改状态Z,再将子进程的退出信号和退出码写入到子进程的pcb的exit_code,exit_signal中,父进程再用*statusp去获取退出信息。

如何等待多个子进程?

用for循环去等待

​ ​

​ ​

为什么不用全局变量获取子进程的退出信息?而用系统调用?

子进程在修改全局变量时发生写时拷贝,父进程是读不到子进程它自己的全局变量的,进程具有独立性,父进程无法直接获取子进程的退出信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值