KILL信号是否立即退出进程?

我正在使用一个使用fork()和exec创建子进程的服务器代码.当fork()成功并在CHILD信号被捕获时被清除,该小孩的PID被注册.

如果服务器需要停止,所有程序都将被杀死,最终会出现KILL信号.现在,这可以通过遍历所有注册的PID并等待CHILD信号处理程序来删除PID.如果子程序未正确退出,则会失败.因此,我想使用kill与waitpid结合使用,以确保PID列表被清理并记录并执行其他的其他操作.

考虑下一个代码示例:

kill(pid,SIGKILL);
waitpid(pid,NULL,WNOHANG);

摘录from waitpid(2):

waitpid(): on success,returns the process ID of the child whose state has changed; if WNOHANG was specified and one or more child(ren)
specified by pid exist,but have not yet changed state,then 0 is returned. On error,-1 is returned.

在下一个功能开始之前,pid给出的过程是否总是消失?在上述情况下waitpid总是返回-1吗?

解决方法

Is the process given by pid always gone before the next function kicks in?

没有保证.在多处理器上,您的进程可能在cpu 0上,而内核中的被杀死进程的清理发生在cpu 1上.这是一个古典的竞争条件.即使在单核处理器上也不能保证.

Will waitpid always return -1 in the above case?

由于它是一种竞争条件 – 在大多数情况下也许会这样.但是没有保证.

由于你对状态不感兴趣,所以在这种情况下,这个semicode可能更合适:

// kill all childs
foreach(pid from pidlist)
    kill(pid,SIGKILL);

// gather results - remove zombies
while( not_empty(pidlist) )
    pid = waitpid(-1,WNOHANG);
    if( pid > 0 )
        remove_list_item(pidlist,pid);
    else if( pid == 0 )
        sleep(1);
    else
        break;

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...