下面的代碼之前,我做:如何從子進程讀取標準輸出,當後者不刷新其標準輸出?
創建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?
只要數據沒有被刷新,就不會寫入,因此沒辦法! – 2014-09-04 00:05:12
同意!但是,一旦蟒蛇子過程死亡,管子是否不應該自動沖洗? – Kam 2014-09-04 00:06:13
@Kam這取決於它是如何死亡。如果它正常退出,所有的'stdio'緩衝區都應該被刷新。如果中止,可能不是。 – EJP 2014-09-04 01:20:20