_018_回收子进程_信号传参
Posted huangtiandi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_018_回收子进程_信号传参相关的知识,希望对你有一定的参考价值。
=============================================================
回收子进程
=============================================================
1 创建10个子进程,在46行正常结束,在55行对SIGCHLD信号进行捕获,捕获的过程的阻塞的,不会执行下面的代码,只有处理了我们指定的函数
才会继续执行下面的代码
2 我们的函数叫do_sig_chird,waitpid函数是对指定的进程进行回收(具体看_013_进程),第一个参数填0,也就是回收我们所有的子进程,第二个参数保存了状态
第三个参数表示了不予以等待. 就是非阻塞,因为也没必要阻塞,我们既然已经到20行了,就代表已经捕获了SIGCHLD的信号,不需要再等待
至于WIFEXITED是第二个参数的宏指定,22行的WEXITSTATUS是取得子进程exit()返回的结束代码,也就是取得我们第46行的return i+1
(以上都是waitpid函数的描述,具体看_013_进程的waitpid函数)
3 整个程序意思是,创建10个子进程,由父进程对每个进程进行回收
4 如果第20行的while改成if,逻辑上似乎也能得到同样的效果,但是实际上,会有一部分子进程没有回收,因为我们子进程的结束是不确定的,也就是说不确定
哪个子程序先结束,并不是想象的子进程1,子进程2...这样按顺序结束的.因为cpu的占领原因,所以不确定哪个子进程先结束
所以我们捕获的子进程也不确定,假如waitpid捕获到了2号子进程,此时子进程3号和进程4号死亡,也发送了SIGCHLD信号,而if之执行一次
所以有的子进程没有回收到
=============================================================
信号传参
=============================================================
以上是关于_018_回收子进程_信号传参的主要内容,如果未能解决你的问题,请参考以下文章