SIGCLD语义-数据流图到模块结构图的直接转换方法

时间:2024-07-12 01:23:45
【文件属性】:

文件名称:SIGCLD语义-数据流图到模块结构图的直接转换方法

文件大小:5.82MB

文件格式:PDF

更新时间:2024-07-12 01:23:45

APUE UNIX

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


网友评论