简单的问题,但我还没有找到答案。给定一个特定的 PID,我可以确定该进程是否处于事件状态吗?我正在开发一个 C 程序,这让我抓狂。我在某处读到 kill(pid,0)
可以解决问题,但无论进程是否正在运行(或看起来如此),它都会返回 0。
有什么提示吗?
附加信息:
我感兴趣的进程是由 fork()
启动的子进程。
子进程在到达语句 exit(0) 时应该终止。
至少这是我所期望的......显然它没有。
更多信息:
使用 fork()
创建的子进程执行系统命令,该命令可能因最终用户而异。整个事情是批处理过程的一部分,所以没有机会介入并修复某些东西。此子进程可能必须执行的任务之一是建立到远程服务器的连接,以便在那里存储一些文档。这可能是另一台 Linux 机器,也可能是 Win 服务器(或可能是其他东西)。出于这个原因,我不想等待子进程。我希望 parent 等待一段特定的时间(比如 10 秒),然后在子进程尚未完成时终止它。同样的道理,如果子进程在 3 毫秒内完成任务,我不希望父进程等待 10 秒。
看来我不是第一个遇到这个问题的。
最佳答案
您正在寻找waitpid它将返回给定 PID 的状态信息。
对于不相关的进程,您可以在 linux 中使用 /proc/[pid]/stat
并读取输出。
关于更新信息
IMO 有两种情况。
首先:
子进程很快就完成了。使用 waitpid(使用 WNOHANG)并获取它的状态,然后您就知道它是如何终止的以及它实际上是如何终止的。
第二个:
子进程正在运行。将 waitpid 与 WNOHANG 一起使用并检查它是否仍在运行。如果不执行父项需要执行的任何其他操作,经过足够的时间后,子项仍在运行,您可以终止它,或者执行您的设计认为合适的任何响应作为适当的响应。
无论哪种方式,waitpid 正是您在这里所需要的。伪代码只是演示,你可以在两者之间做其他事情,即使 child 提前终止,你也不需要等待 10 秒,因为这样的轮询并不合适。
伪代码:
pid_t pid;
pid = fork();
while(1)
{
if(pid == 0)
{
if(status = waitpid(pid, WNOHANG))
{
if(status != exited)
{
if(checkExpiryTime() == true)
kill(pid, SIGKILL);
else
sleep(x); // or whatever is appropriate in your case.
}
}
}
else
{
// do childstuff here.
}
}
关于c - 获取特定 PID 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20999255/