SIGCLD语义-hds ams 2500用户手册

reliance79504 5 0 pdf 2024-07-22 16:07:48

SIGCLD和SIGCHLD这两个信号经常容易混淆。SIGCLD是系统V的一个信号名,其语义与名为SIGCHLD的BSD信号不同。POSIX.1采用了BSD的SIGCHLD信号。BSD的SIGCHLD信号的语义与其他信号相似,子进程状态改变后产生此信号,父进程需要调用一个wait函数以检测发生了什么。

由于历史原因,系统V处理SIGCLD信号的方式不同于其他信号。如果用signal或sigset(设置信号配置的早期函数,与SRV3兼容)设置信号配置,则SVR4继续了这一具有问题色彩的传统。对于SIGCLD早期的处理方式是:如果进程特地指定对该信号的配置为SIG_IGN,则调用进程的子进程将不产生僵死进程。这与其默认动作(SIG_DFL)忽略不同。代之以,在子进程终止时,将其状态丢弃。如果调用进程最后调用一个wait函数,它将阻塞到所有子进程都终止,然后wait会返回-1,其errno则设置为ECHILD。POSIX.1并未说明在SIGCHLD被忽略时应产生的后果,所以这种行为是允许的。

在4.3+BSD中,如果SIGCHLD被忽略,则允许产生僵死子进程。如果要避免僵死子进程,必须等待子进程。在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。使用SVR4版的sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。

如果将SIGCLD的配置设置为捕捉,则内核立即检查是否有子进程准备好被等待,如果是这样,则调用SIGCLD处理程序。这样的方法改变了为此信号编写处理程序的方法。在编写处理SIGCLD信号的程序时,常常需要首先调用signal函数以重新设置此信号处理程序。程序10-3显示了这一点。但在SVR2下编译并运行此程序,其输出是一行行地不断重复“SIGCLD received”,最后进程用完其栈空间并异常终止。

对进程信号有更多兴趣?你可以查看这篇文章 《进程信号和消息队列LinuxC》 了解详细内容。如果你正在解决僵死进程的问题,也许这篇关于《Linux查看和处理僵死进程》 的文章会对你有所帮助。

用户评论
请输入评论内容
评分:
暂无评论