如果进程存在,kill(pid, 0) 是不是保证返回 0?

Posted

技术标签:

【中文标题】如果进程存在,kill(pid, 0) 是不是保证返回 0?【英文标题】:Is kill(pid, 0) guaranteed to return 0 if a process exists?如果进程存在,kill(pid, 0) 是否保证返回 0? 【发布时间】:2012-06-13 23:59:11 【问题描述】:

我在 Centos 4 上,并在我的 C++ 程序中使用 kill(pid, 0) 来检查当前是否有一个进程以给定的 pid 运行。我开始怀疑存在竞争条件,即在进程启动后不久,有一个小时间窗口,即使实际上有一个进程正在运行,kill(pid, 0) 也不会返回零。

这是一个已知问题吗?当 pid 实际存在但刚刚启动时,kill() 是否会返回非零值?如果 kill() 不能可靠地测试是否存在,是否有更好的方法来执行此测试?

【问题讨论】:

【参考方案1】:

kill(pid, 0) 只会在进程存在并且您能够向其发送信号时返回 0。如果进程没有以您的身份运行(并且您不是 root),那么调用将失败并显示 -EPERM。

【讨论】:

如果没有这样的pid,它也会返回ESRCH。 如果您以 root 身份运行,这是不可靠的。因为它只会以 -EPERM 指示权限被拒绝而失败。

以上是关于如果进程存在,kill(pid, 0) 是不是保证返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统上信号发送和信号接收讲解

linux获取jmeter PID并且kill与启动

linux系统怎么kill进程

查看PID 进程是否存在的一个小技巧

shell脚本杀掉(kill)端口号对应的PID进程

shell脚本根据端口号kill掉进程