我已經有了一個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