2012-08-28 51 views
0

我有兩個可執行文件 - 父進程,它是子進程,以長模式運行(例如服務器等)。我需要的只是將孩子的stdout和stderr重定向到父進程,並將它們寫入文件或打印到tty,現在無所謂。將輸出從長時間運行的孩子重定向到父進程

如果我們談論簡單的孩子,這是非常簡單的任務,但與長期運行的孩子與部分輸出是一個問題。

例如,讓我們來看看有pipe的使用(錯誤檢查和其他非重要部位略)流行的解決方案:

parent.c

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, const char *argv[]) 
{ 
    int link[2]; 
    pid_t pid; 
    char str[4096]; 

    pipe(link); 
    pid = fork(); 

    if (pid == 0) { 
    dup2(link[1], STDOUT_FILENO); 
    close(link[0]); 
    execl("/path_to_bin/fast_child", "fast_child", (char *)0); 
    } 
    else 
    { 
    close(link[1]); 
    read(link[0], str, sizeof(str)); 
    printf("Pipe contents: %s\n", str); 
    wait(NULL); 
    } 

    return 0; 
} 

fast_child.c

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, const char *argv[]) 
{ 
    printf("I'm fast child\n"); 
    return 0; 
} 

在e中使用這種類型的子進程xcellent和非問題的方式來獲得STR(出|錯誤)的母公司,但使用此代碼作爲父消失輸出的孩子帶來問題:

slow_child.c

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, const char *argv[]) 
{ 
    for (;;) 
    { 
    printf("I'm slow child\n"); 
    sleep(1); 
    } 
    return 0; 
} 

我考慮使用套接字作爲解決問題的解決方案,但我相信這不是那麼有效的方式,Unix提供了更好的工具來完成這項工作(如往常一樣:)

謝謝。

+0

究竟是什麼,你有問題?你不知道什麼時候你會收到孩子的輸入(可以用'select'來解決)?你不希望父母在'wait'的調用中被阻塞(可以用'waitpid'或'wait4'解決'WNOHANG'標誌)?還有別的嗎? –

+0

好的,我想在一個小孩的所有(長期)生活中都會發胖,但是在這個胖胖的時候,我現在無法得到它。換句話說,在當前的'parent.c'實現中沒有長時間運行的孩子的輸出。 –

回答

3

您需要每隔一段時間刷新孩子的輸出,否則父任務將看不到任何內容。在適當的地方使用fflush(stdout)。或者你可以在標準輸出上關閉緩衝,但是這可能會對你的孩子產生性能影響,因爲它會對每個寫入的字符進行系統調用。

+0

我無法想象'fflush()'與管道。可能嗎? –

+0

是的。它只是一個文件句柄。它會導致C運行時系統將其緩衝的內容刷新到底層句柄。 –

+0

所以問題是真的在不衝動的孩子。萬分感謝! [其他信息](http://stackoverflow.com/a/2712994/323249) –

相關問題