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

标签 c linux signals

我正在编写使用 fork() 和 exec 创建子进程的服务器代码。 child 的 PID 在 fork() 成功时注册,并在 CHILD 信号被捕获时清除。

如果服务器需要停止,所有程序都会被终止,最终会发出 KILL 信号。现在,这是通过遍历所有已注册的 PID 并等待 CHILD 信号处理程序删除 PID 来实现的。如果子程序没有正确退出,这将失败。因此,我想将 killwaitpid 结合使用,以确保清理 PID 列表并记录并做一些其他事情。

考虑下一个代码示例:

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

摘自 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?

因为这是一个竞争条件——在大多数情况下它可能会。但不能保证。


由于您对状态不感兴趣,此半代码可能更适合您的情况:

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

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

关于c - KILL 信号是否立即退出进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679226/

相关文章:

c - 为什么 fetestexcept() 在乘以 float 时有时会报错?

linux - 如何正确运行 Perl "one liner"命令行脚本?

ruby-on-rails - 将 Rails 应用程序推送到 Heroku 时出错

bash - 为什么我的 bash 脚本在后台运行时需要很长时间才能响应 kill?

qt - Qt slots可以当普通方法使用吗?

python - 忽略错误代码 141 的 Bash pipefail

c - 如何根据库中的地址查找函数名称

c - c中的二分法程序为什么我需要在if语句之前?

c - 仅使用一些字符串操作和 <stdio.h> 进行加密

linux - 如何从不同的目录写入文件,将名称和编号放入该文件并对其进行排序并打印更新的文件