2016-10-06 46 views
0

我正在編寫一個插入另一個程序的任務printf()。它分叉一個子進程並將所有程序的輸出重定向到子進程。下面的代碼是我寫的還沒有運行,我想在它上面添加這個函數。如何分叉子進程並將所有程序的輸出重定向到子進程?

int printf(char* format, ...) 
{ 
    int res; 
    static void *(*mallocp)(size_t size); 
    char *error; 
    if (!mallocp) { 
    mallocp = dlsym(RTLD_NEXT, "printf"); 
     if ((error = dlerror()) != NULL) { 
      fputs(error, stderr); 
      exit(1); 
     } 
    } 
    va_list args; 
    va_start(args, format); 
    res=mallocp(format, args); 
    va_end(args); 
    return res; 
} 

我找到了一個類似的解決方案,但有點不同。 Redirect stdin and stdout in child in c 我真的不知道在我分叉一個子進程並配置管道後,我怎麼能讓父母進程繼續使用系統「printf」mallocp來給出應該被重定向到子進程的stdout。 (在這個例子中可能有些像system("./calc/calc ");)我是這個領域的新手。你可以告訴我嗎 ?

順便說一句,我不知道我是否理解整個過程的實施,因爲它是一個問題,我不知道官方的解決方案。

+0

什麼是problem_你正在試圖解決這樣的_actual? –

回答

0

使用「dup2」並用「pipe」寫入文件描述符替換「stdout」。

我假設你的管道配置良好,從父母到孩子。

然後孩子可以從另一端讀取。

dup2(fd,1); // 1是標準輸出

第二個選項:(如果你管不好了)

使用共享內存。

創建共享內存對象。

將父母的STDOUT重定向到共享內存。

孩子可以看到它。

這裏有一個例子 http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/example-1.html

+0

那麼,鏈接不是我的代碼,只是一個類似的例子。我認爲'system(「./ calc/calc」);'是我需要根據我的問題改變的地方。 Becaue我需要父進程來實現系統'printf'而孩子聽標準輸出 – shen

+0

嘗試共享內存對象。更新了答案 – Naidu

相關問題