2014-09-03 42 views
0

下面的代碼之前,我做:如何從子進程讀取標準輸出,當後者不刷新其標準輸出?

  • 創建1管從分叉處理中讀取輸出

  • 叉()

  • execv()的Python腳本

然後在父程序中我做:

//set pipes to non-Blocking 
File * cout_f = fdopen(cout_pipe[0], "r"); 
int flags = fcntl(cout_pipe[0], F_GETFL, 0); 
fcntl(cout_pipe[0], F_SETFL, flags|O_NONBLOCK); 

// read from pipe and send it up through a callback method 
int stat; 
size_t size = 0; 
char buffer [ 1000 ]; 
do 
{ 
    while((size = fread(buffer, sizeof(char), sizeof(char)*1000, cout_f))!=0) 
    { 
     call_back_function(buffer, size); 
    } 
}while(waitpid(child_pid, &stat, WNOHANG) != -1) 

//Do 1 extra read 
while((size = fread(buffer, sizeof(char), sizeof(char)*1000, cout_f))!=0) 
{ 
    call_back_function(buffer, size); 
} 

我正面臨的問題發生在子進程打印到標準輸出並在沖洗前退出(通常)。我想念管道里發出的東西。

這裏是我的問題:

  • 是上面的代碼安全/正確或能不能改進?
  • 有沒有辦法在子進程死亡的最後一刻讀取整個管道,即使它沒有刷新其stdout?
+3

只要數據沒有被刷新,就不會寫入,因此沒辦法! – 2014-09-04 00:05:12

+0

同意!但是,一旦蟒蛇子過程死亡,管子是否不應該自動沖洗? – Kam 2014-09-04 00:06:13

+0

@Kam這取決於它是如何死亡。如果它正常退出,所有的'stdio'緩衝區都應該被刷新。如果中止,可能不是。 – EJP 2014-09-04 01:20:20

回答

2

您不必等待。當你閱讀它時,只需發送一切。這就是你的代碼已經做的。擺脫非阻塞模式;擺脫了(等待(...))條件;擺脫最後的閱讀;只需執行第一個讀取循環,直到流結束。然後調用wait()來獲得退出代碼。

如果進程也在stderr上產生,則需要在另一個線程中讀取該進程,否則當stderr緩衝區填滿時,它將被阻塞。

+0

噢,你是對的,我其實是讀了stderr。那麼我的問題可以通過上述實施來解決嗎? – Kam 2014-09-04 02:16:28

+1

或者,如果您不想要第二個線程,則可以使用select系統調用來等待數據在任一管道上可用。 – wrdieter 2014-09-04 02:23:05

+0

但是我沒有得到的是上面代碼中的問題。我沒有得到什麼錯誤,所以我可以修復它。任何想法? – Kam 2014-09-04 02:25:35

相關問題