我正在处理使用fork()
和exec来创建子进程的服务器代码。当fork()
成功并且在CHILD
信号被捕获时被清除,该孩子的PID被注册。KILL信号是否立即退出进程?
如果服务器需要停止,所有的程序都会被终止,最终会产生一个KILL信号。现在,这是通过遍历所有已注册的PID并等待CHILD信号处理程序去除PID来工作的。如果子程序没有正确退出,这将失败。因此,我想使用kill
与waitpid
结合使用,以确保PID列表被清除并记录,否则会执行其他一些操作。
考虑下一个代码样品:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
摘自waitpid(2)
:
waitpid函数():成功时返回其状态已经改变子的进程ID;如果WNOHANG被指定并且存在一个或多个由pid指定的子(ren) ,但尚未更改状态,则返回0。出错时,返回-1。
由pid
给出的过程总是在下一个函数启动之前消失吗?在上述情况下,waitpid
总是会返回-1
?
KILL信号相当残酷,为什么不是INT或HUP?还有,“kill”系统调用的返回码是什么? “ – fge 2011-12-30 12:03:21
”等待CHILD信号处理程序...“ - SIGKILL没有信号处理程序,你知道吗?除了SIGSTOP和SIGKILL以外,所有的信号都会执行'sigaction'(例如调用处理程序)或缺省值。 SIGSTOP刚刚停止,SIGKILL只是杀死了这个进程。总是。没有处理或有条件的。 (例外情况是'kill'系统调用失败,因为你没有足够的权限。) – Damon 2011-12-30 12:15:47
@Damon:目标进程不能忽略'SIGKILL',这就对了。但那不是问题/问题。源进程的'kill(2)'系统调用可以在信号在目标进程的上下文中被内核评估之前返回。 'kill(2)'基本上是一个非常简单的异步通信,必须作为所有含义来对待。 – 2011-12-30 12:22:07