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

KILL信号是否立即退出进程?,第1张

概述我正在使用一个使用fork()和exec创建子进程的服务器代码.当fork()成功并在CHILD信号被捕获时被清除,该小孩的PID被注册. 如果服务器需要停止,所有程序都将被杀死,最终会出现KILL信号.现在,这可以通过遍历所有注册的PID并等待CHILD信号处理程序来删除PID.如果子程序未正确退出,则会失败.因此,我想使用kill与waitpid结合使用,以确保PID列表被清理并记录并执行其他 我正在使用一个使用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 childsforeach(pID from pIDList)    kill(pID,SIGKILL);// gather results - remove zombIEswhile( not_empty(pIDList) )    pID = waitpID(-1,WNOHANG);    if( pID > 0 )        remove_List_item(pIDList,pID);    else if( pID == 0 )        sleep(1);    else        break;
总结

以上是内存溢出为你收集整理的KILL信号是否立即退出进程?全部内容,希望文章能够帮你解决KILL信号是否立即退出进程?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存