进程终止
退出码
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循环去等待
为什么不用全局变量获取子进程的退出信息?而用系统调用?
子进程在修改全局变量时发生写时拷贝,父进程是读不到子进程它自己的全局变量的,进程具有独立性,父进程无法直接获取子进程的退出信息。