我已经有了一个C++应用程序,它包含一个队列中的某些项目,然后这些项目将由一个python脚本处理。我希望它最多可以运行10个python脚本实例。我打算使用execl()来启动python进程,是否有办法告诉进程已经退出而不必将消息传递回父进程?告诉execl()进程何时退出
1
A
回答
5
execl
不启动进程 - 它将现有进程覆盖到另一个可执行文件。 fork
确实启动一个进程 - 并将子进程的ID(又名pid
)返回给父进程(将子进程返回0,这就是孩子知道它是子进程以便它可以清理和exec
)。使用儿童的pid
来检查它们是否完成,或者捕获SIGCHLD以跟踪该情况。
我建议SIGCHLD
所以你不必“民意调查”,看看一些进程已经终止,但后者的做法是不是太硬或者 - 只是在一段时间执行一次:
def whosdone(pids):
nope = []
done = []
for pid in pids:
try: os.kill(pid, 0)
except OSError: nope.append(pid)
else: done.append(pid)
return done, nope
即你可以定期拨打电话done, pidslist = whosdone(pidslist)
,并做任何你需要做的关于完成的PID。当然,当你fork
,使用成语:
pid = os.fork()
if pid: # we're the parent process
pidslist.append(pid)
else: # we're the child process
# clean things up, etc, then exec
0
如果你是Unix/Linux下做这在C++中,检查出wait(), waitpid(), waitid(),wait3(), or wait4()。您可以调用waitpid()NOHANG(轮询)或阻止它,直到子进程完成。 PID(进程ID)的值由fork().
I did a painful "hard way" example of fork() earlier (using dup2() to re-route IO).
相关问题
- 1. 如何知道进程何时退出?
- 2. 如何告诉valgrind memcheck分叉进程?
- 3. 如何在pthread退出时保持进程退出?
- 4. 告诉应用程序打开,然后退出时不是AppleScript的
- 5. 如何告诉父进程等待子进程?
- 6. wxGLCanvas退出进程
- 7. 退出所有子进程退出
- 8. 如何可靠地告诉boost线程是否已退出运行方法?
- 9. 父进程退出时检测
- 10. 当进程退出时SIGCHLD未交付
- 11. 退出tmux时自动关闭进程
- 12. 当进程退出时重置Android Widget
- 13. 如何找出进程何时退出Linux?
- 14. 如何使用Ctrl + D退出,如使用execl bash?
- 15. 每当发出警告时退出
- 16. C#检测进程退出
- 17. Apache进程退出255(WAPP)
- 18. Python进程不会退出
- 19. Solaris进程挂在退出
- 20. Java进程不退出
- 21. 问题已退出进程
- 22. Poco进程不退出
- 23. 如何让我的程序在进入退出后退出
- 24. 退出应用程序时,一个进程正在进行
- 25. 强制终止进程时的进程退出代码
- 26. 如何告诉DataProvider进行更新?
- 27. 当主线程退出时,如何让子线程退出?
- 28. 如何检查Linux进程及其所有子进程何时退出?
- 29. 应用程序退出进程退出事件
- 30. 进程退出问题线程未成功退出
返回你能够扩大对如何检查孩子的PID的检查,如果他们完成了吗?我不明白如何告诉我他们是否完成 – whatWhat 2009-06-14 02:21:25