2011-12-07 69 views
1

可能重複:
Writing my own shell… stuck on pipes?在C手動執行管道

我建立一個程序具有類似功能的外殼,我想知道如何執行配管作業。因此,當系統執行program1 arg | tee output-file時,系統將連接tee中的stdinprogram1中的stdout以及捕獲任何stderr和最終的stdout

+0

它是,但它會類似於UNIX上的c + +,但我真的不知道如何執行該問題的管道操作。 – topherg

+0

在那裏的答案中的代碼應該工作得很好,因爲C和C++,以及任何類Unix,包括Linux,BSD,Mac OS,Solaris ... – bdonlan

+0

@bdonlan righto,我不知道他的函數如何在其餘的內部使用它會運行請求字符串並在'|'點拆分,然後運行1到2,然後2運行到3(如果超過2)? – topherg

回答

2

向用於管:

int p[2]; 
pipe(p); 

第一程序的exec()之前,它的標準輸出綁定到它,並關閉其它FDS:

dup2(p[0], STDOUT_FILENO); 
close(p[0]); 
close(p[1]); 

第二的exec()之前程序重定向其標準輸入:

dup2(p[1], STDIN_FILENO); 
close(p[0]); 
close(p[1]); 

您還將必須在fork()之後關閉主程序中管道的兩端,並且完成(用於管道設置)。

+0

管道最常見的錯誤之一是沒有關閉足夠多的文件描述符。這段代碼避免了這個問題。 –