c - 获取特定 PID 的状态

标签 c linux pid

简单的问题,但我还没有找到答案。给定一个特定的 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/

相关文章:

linux - 嵌套 for 循环的问题

MacOS : find out if a process (given a PID) is running in 32bit or in 64bit Intel mode

c - Eclipse CDT平台独立项目

c++ - 关于 char 指针,sizeof 运算符如何工作?

c++ - Bool 永远不会为 NULL [-Waddress]

linux - 如何生成不同的脚本以在Linux中的每个目录上运行?

c - 无法使用 libcurl 读取数据

c - 如果一个应用程序打开多个到 syslog 的连接会怎样?

linux - 如何获取awesome-wm的PID

bash - 查找子进程数