在 Linux 中获取父进程状态
Get parent process status in Linux
正在尝试从其子进程 P' 之一获取给定进程 P 的进程状态。
我知道 waitpid() 函数,但在文档中,它说它用于检查子进程的状态。
那么还有其他方法吗?
没有标准函数可以让进程等待其 parent 终止或获取其 parent 的退出状态。进程树不是那样工作的——children 在他们退出时通知他们的 parents,而不是相反。
因此,如果您希望 child 进程获悉其 parent 的死亡,您必须安排 parent 主动通知它们。这似乎是一个信号传递的工作。如果您只需要通知 children parent 完全退出(即从 main()
返回或调用 exit()
),那么这本身就足够了。选择一个信号——可能是 SIGUSR1
或 SIGUSR2
——并让 parent 注册一个 atexit()
处理程序,该处理程序将那个信号发送到 children。这可能需要也可能不需要 parent 来跟踪其 children。
尽管您提到获得 parent 的退出状态,但您可能还想要更多。您可以通过选择将两个(或更多)信号中的哪一个发送给 children 来获取 coarse-grained 信息,但是要获得更详细的信息,您需要一个 IPC 机制。您可以将退出状态写入共享内存或管道(或其中的几个),将消息发送到套接字或消息队列,将状态写入普通文件,或者可能是我没有想到的其他内容。
您还应该考虑到现有模型运行良好,并且已经运行了 40 年左右。它可能确实不能满足您的需求,但我敦促您考虑是否可以改进您的设计以更干净地适应 Unix 模型。
正在尝试从其子进程 P' 之一获取给定进程 P 的进程状态。
我知道 waitpid() 函数,但在文档中,它说它用于检查子进程的状态。
那么还有其他方法吗?
没有标准函数可以让进程等待其 parent 终止或获取其 parent 的退出状态。进程树不是那样工作的——children 在他们退出时通知他们的 parents,而不是相反。
因此,如果您希望 child 进程获悉其 parent 的死亡,您必须安排 parent 主动通知它们。这似乎是一个信号传递的工作。如果您只需要通知 children parent 完全退出(即从 main()
返回或调用 exit()
),那么这本身就足够了。选择一个信号——可能是 SIGUSR1
或 SIGUSR2
——并让 parent 注册一个 atexit()
处理程序,该处理程序将那个信号发送到 children。这可能需要也可能不需要 parent 来跟踪其 children。
尽管您提到获得 parent 的退出状态,但您可能还想要更多。您可以通过选择将两个(或更多)信号中的哪一个发送给 children 来获取 coarse-grained 信息,但是要获得更详细的信息,您需要一个 IPC 机制。您可以将退出状态写入共享内存或管道(或其中的几个),将消息发送到套接字或消息队列,将状态写入普通文件,或者可能是我没有想到的其他内容。
您还应该考虑到现有模型运行良好,并且已经运行了 40 年左右。它可能确实不能满足您的需求,但我敦促您考虑是否可以改进您的设计以更干净地适应 Unix 模型。