2012-03-15 21 views
1

我正在爲使用popen基本上執行「python myserver.py」和shell = False的服務器編寫一個單元測試框架,運行一些測試,然後繼續通過killpg關閉服務器。打開一個使用多處理調用腳本的python調用(pgrp問題)?

這個myserver.py可以並將使用多處理來產生它自己的子進程。問題是,在我的測試中,似乎服務器進程的pgrp pid與運行unittests的實際主線程共享相同的組pid,因此在組pid上執行os.killpg不僅會取消服務器,也是調用popen的過程(不是我想要做的)。它爲什麼這樣做?我怎樣才能讓他們成爲獨立的團體pid,我可以獨立殺人?

回答

1

你在問這件事很麻煩。我懷疑這些都不是你想要做的,而且你確實想要以更簡單的方式完成這個任務。但是,假定您真的想要混淆進程組...

通常,僅通過setpgrp(2)系統調用創建新的進程組。否則,由fork(2)創建的進程始終是當前進程組的成員。這就是說,在創建一個新的流程組時,該組中的流程甚至不受任何tty控制,並且正確執行您希望做的事情需要了解整個流程組模型。關於這些工作的一個很好的參考是史蒂文斯,「Unix環境下的高級編程」,它深入細節地介紹了它。

如果你真的想要走這條路線,你將不得不在實施所有適當的系統調用時自己實現popen或等價物。

+1

你不需要重新實現popen。使用'subprocess.Popen'和'preexec_fn = os.setpgrp'。 – 2013-07-07 03:31:43

相關問題