2012-02-26 83 views
6

我有一個要求fork()獲取派生進程的標準輸出/標準錯誤在子進程

一個C程序,我有一個python腳本與

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0) 

執行C程序現在,我可以讀從標準輸出標準錯誤child.stderr.read(1)child.communicate(),...但我的問題是,現在,我怎麼能得到輸出分叉過程。這甚至有可能嗎?我可以從兩個版本中獲得pid嗎,原始的C程序和fork

親切的問候, 非常感謝你:)

的Fabian

+0

「這可能嗎?」沒有。「我可以從兩個版本,原始的C程序和叉子上獲得pid嗎?」不是.C程序擁有那個孩子。你的進程擁有C程序。現在。不要擔心Linux的細節,並描述你的**真實**問題。爲什麼你的Python程序不能像C程序那樣運行相同的子進程? – 2012-02-26 15:00:49

+0

更簡單的方法可能是使用不同的輸出格式,主進程可以從「ParentOutput:」開始,而子進程的輸出是:「ChildOutput:」。然後你可以忽略你的python程序中的「ParentOutput」。 – springrider 2012-02-26 15:06:39

回答

1

什麼你問的是要複雜和純Python將是不可能的 - 你會需要一些OS-具體機制。

你真的提出了兩個要求:

  • 從父進程
  • 攔截標準/出任意進程的PID標識派生進程

你如果你在Linux上,可能可以通過解析/ proc來實現前者,後者實際上是類似於調試器的一部分功能(例如,How can a process intercept stdout and stderr of another process on Linux?

更可能的是,您將需要更改C程序的工作方式 - 例如,從python腳本中執行fork()/守護進程而不是中間C代碼可以讓您直接獲取子進程。

0

我認爲當你在C中fork一個進程時,你不能將任何描述符從子進程傳遞迴父進程 - 但可能是我錯了。只有你得到的是新的子進程的PID。最好的方法應該是你打開一個管道(使用通常的名稱,例如管道名稱包含進程的PID),然後你可以從任何地方打開它。

最後,當你fork()的過程中,將其提供給您的PID,並且可以編寫兩個PID(C二進制和叉狀),以C程序中,例如具有分離器的標準輸出:

cpid = fork(); 
printf("%d|%d", (int)get_pid(), cpid); 

祝你好運:)

相關問題