我用C编写了一个程序。为了在分叉的子进程中执行execve()来执行未知的应用程序(由用户在命令行中给出),我在主进程中执行了fork()。我知道执行应用程序的进程的PID - 它由fork()返回,但是这个未知的应用程序可能多次fork(),我不知道所有子进程的PID(它们是主父进程的孙子)。我该如何检查主父进程何时其子进程(它是未知应用)和全部未知应用退出的子进程? (我甚至不知道它有多少孩子,我不知道这些孩子的PID)。如何检查Linux进程及其所有子进程何时退出?
0
A
回答
3
这可以通过使您的父进程是一个子派生器来完成。一个subreaper可以让所有的孩子成为其后代的孤儿,而这些传统上总是会进入init(进程ID 1)。在派生有趣的子进程之前,需要启用子派生器状态。完成此操作后,任何进程的waitpid()
或类似调用都会返回子进程和所有孤儿后代,直到整个树消失时返回错误[ECHILD]
。
在Linux上,这是使用prctl()
的PR_SET_CHILD_SUBREAPER
选项启用,而在FreeBSD这是使用procctl()
PROC_REAP_ACQUIRE
命令(详见手册页)启用。
在Linux上,您将能够以这种方式单独监视一个子进程,因为孤儿不记得它们来自哪个原始分叉调用。在FreeBSD上,PROC_REAP_GETPIDS
允许区分各个子树,但如果树包含许多进程,则效率较低。
-1
您可以使用waitpid(-1,NULL,WNOHANG)来判断是否有一个孩子已经退出。如果你收到一个正数(一个PID),那么一个孩子已经退出。在你的父进程中,你有一行检查你的子进程的数量(这里叫做x)是否大于0.如果它使用这个命令来查看是否有任何子进程已经结束。如果你有x个项目,那么当你添加一个项目增量x,当一个退出时减少x。当你所有孩子的数量x为零时,你所有的孩子都被杀死了。
相关问题
- 1. 如何等待进程及其所有子进程退出?
- 2. 如何等待Windows进程及其子进程全部退出?
- 3. 如何计算Linux中进程及其所有子进程的CPU利用率?
- 4. 退出所有子进程退出
- 5. 超时后,终止进程及其所有子进程
- 6. 如何超时运行的函数及其在Linux上的所有子进程?
- 7. 检查POSIX中退出的子进程?
- 8. 如何跟踪由进程及其子进程打开的所有文件?
- 9. 如何找出进程何时退出Linux?
- 10. Linux:当父母退出时退出分叉子进程
- 11. 如何检查Linux进程以确定进程何时/何时终止/终止?
- 12. 如何在Linux中从命令行中杀死进程及其所有线程?
- 13. 如何知道进程何时退出?
- 14. 什么是kthreadd进程和子进程以及它如何与初始进程和子进程有所不同
- 15. 多线程 - 杀死线程及其所有子进程
- 16. Node.js检测子进程退出
- 17. C#检测进程退出
- 18. 检查两个进程的退出码
- 19. 如何检查进程的进程
- 20. 如何重定向StandardInput进程没有进程立即退出?
- 21. 如何从shell脚本中退出时终止所有子进程?
- 22. 如何在另一个孩子完成时退出子进程
- 23. 正在退出子进程
- 24. 退出子进程,安全
- 25. 父进程退出时检测
- 26. 杀死一个已创建的子进程及其创建的所有进程
- 27. 检查子进程
- 28. 告诉execl()进程何时退出
- 29. 如何在pthread退出时保持进程退出?
- 30. 如何杀死一个应用程序及其所有线程/进程
可能重复[如何从父进程获取子进程](http://stackoverflow.com/questions/17743879/how-to-get-child-process-from-parent-process) – klutt
我很漂亮确定你不能以正常的方式做到这一点。也许涉及'ptrace'的东西? – melpomene
应用程序应照顾其子女。你不应该担心他们。 – PSkocik