如何在c ++中的main()中检查进程是否正在运行或者是否已从linux中的pid中进行了segfaulted或终止

时间:2010-06-08 13:44:44

标签: c++ linux

我在main中调用了几个进程,我可以获得该进程的pid。现在我想等到所有这些进程完成后再清除父进程中的共享内存块。此外,如果任何过程没有完成和segfaulted我想杀死该过程。那么如何从我的父进程代码中的进程的pid中检查进程是否完成没有任何错误,或者它给出了运行时错误或任何其他原因的错误,以便我可以杀死该进程。

此外,如果我想查看其他一些不是子进程但其pid已知的进程的状态。

感谢代码(我不是在寻找脚本而是代码)。

4 个答案:

答案 0 :(得分:4)

使用WNOHANG选项查看waitpid(2)。使用手册页中的宏检查流程的“命运”,尤其是WIFSIGNALED()

此外,segfaulted进程已经死了(除非SIGSEGV由进程专门处理,这通常不是一个好主意。)

答案 1 :(得分:2)

根据您的更新,您似乎还想查看其他进程,这些进程不是您当前进程的子进程。

您可以查看/proc/{pid}/status以了解流程当前正在做什么,它将会是:

  • 运行
  • 停止
  • 睡眠
  • 磁盘(D)睡眠(i / o绑定,不间断)
  • 僵尸

然而,一旦一个进程死亡(完全,除非被僵尸),所以它的进入/ proc。没有办法判断它是否成功退出,发生了分段,捕获了无法处理的信号,或者无法处理可以处理的信号。除非其父母在某处记录该信息。

听起来你正在为自己没有启动的其他进程编写监视程序,而不是跟踪子进程。

答案 2 :(得分:1)

如果某个程序出现段错误,则无需将其删除。它已经死了。

使用waitwaitpid来电等待孩子完成并查看状态,了解他们如何退出。有关如何使用这些功能的详细信息,请参阅here。请特别注意WIFSIGNALEDWTERMSIG宏。

答案 3 :(得分:0)

来自SIGCHLD处理程序的

waitpid()用于捕获应用程序终止自身的时刻。请注意,如果您启动多个进程,则必须使用WNOHANG循环waitpid(),直到它返回0.

kill(),信号为0,检查进程是否仍在运行。 IIRC僵尸仍然有资格作为进程,因此您必须拥有适当的SIGCHLD处理程序才能工作。