-
鸿鹄论坛华为认证h35-211-hcnp-access network题库涵盖了SIGCLD语义内容
资源介绍
10.7 SIGCLD语义
S I G C L D和S I G C H L D这两个信号经常易于混淆。 S I G C L D是系统V的一个信号名,其语义
与名为S I G C H L D的B S D信号不同。P O S I X . 1则采用B S D的S I G C H L D信号。
B S D的S I G C H L D信号的语义与其他信号的语义相类似。子进程状态改变后产生此信号,
父进程需要调用一个w a i t函数以检测发生了什么。
由于历史原因,系统V处理S I G C L D信号的方式不同于其他信号。如果用 s i g n a l或s i g s e t(设
置信号配置的早期的与S RV 3兼容性函数)设置信号配置,则S V R 4继续了这一具有问题色彩的
传统(即兼容性限制)。对于S I G C L D早期的处理方式是:
(1) 如果进程特地指定对该信号的配置为 S I G _ I G N,则调用进程的子进程将不产生僵死进
程。注意,这与其默认动作( S I G _ D F L)忽略(见表1 0 - 1)不同。代之以,在子进程终止时,
将其状态丢弃。如果调用进程最后调用一个 w a i t函数,那么它将阻塞到所有子进程都终止,然
后该w a i t会返回-1,其e r r n o则设置为E C H I L D。(此信号的默认配置是忽略,但这不会造成上述
语义。代之以我们必须特地指定其配置为S I G _ I G N。)
P O S I X . 1并未说明在 S I G C H L D被忽略时应产生的后果,所以这种行为是允
许的。
4 . 3 + B S D中,如S I G C H L D被忽略,则允许产生僵死子进程。如果要避免僵死
子进程,则必须等待子进程。
在S V R 4中,如果调用 s i g n a l或s i g s e t将S I G C H L D的配置设置为忽略,则不会
产生僵死子进程。另外,使用 S V R 4版的s i g a c t i o n,则可设置S A _ N O C L D WA I T标
志(见表1 0 - 5 )以避免子进程僵死。
(2) 如果将S I G C L D的配置设置为捕捉,则内核立即检查是否有子进程准备好被等待,如果
是这样,则调用S I G C L D处理程序。
第( 2 )项改变了为此信号编写处理程序的方法。
实例
1 0 . 4节曾提到进入信号处理程序后,首先要调用 s i g n a l函数以再设置此信号处理程序。(在
信号被复置为其默认值时,它可能被丢失,立即重新设置可以减少此窗口时间。)程序1 0 - 3显
示了这一点。但此程序不能正常工作。如果在 S V R 2下编译并运行此程序,则其输出是一行行
地不断重复“SIGCLD received”。最后进程用完其栈空间并异常终止。
此程序的问题是:在信号处理程序的开始处调用 s i g n a l,按照上述第 ( 2 )项,内核检
查是否有需要等待的子进程(因为我们正在处理一个 S I G C L D,所以确实有这种子进程),
第 1 0章 信 号 2 1 1
下载