2017-05-21 35 views
0

嗨,我有麻煩包裝我的頭周圍這個概念。從C外部文件(或控制文件)管道中的兩個文件unix

我需要執行兩個文件可以說,從交流CONTROL.C叫

我要管的交流輸出到BC的輸入

據我所知,文件描述符(控制文件& BC FD): FD 0 = stdin中 FD 1 =標準輸出

據我所知,創建一個管需要一個整數數組(二FDS)

e.g. 
zpipe[2] 
pipe(zpipe) 

我想執行文件a和b並將a的輸出傳送到b的輸入。

但是我對這個概念感到困惑,因爲打開或閱讀所述文件會創建一個新的fd。我知道通過調用fda = dup2(fd,0)可以將fd(例如fda)設置爲0。這會不會因爲0現在關閉而破壞管道?

,如果我叫

execvp("a.c", args) 
execvp("b.c", args) 

如何將我保證這些文件被正確管道和等待?

+0

你的命名是混亂(以我們),或者說你感到困惑,通常,'ac'是一個C源文件 - 它將被編譯成一個獨立的程序'a'(或者''a.exe'),你運行程序或執行它們。如果有一個名爲'ac'的可執行程序是不尋常的(不是不可能,但絕對不尋常),對於'bc'和'b'也是如此,你可以調用'if(dup2(zpipe [0],0)!= 0 ){...處理錯誤...}'或'if(dup2(zpip e [1],1)!= 0){...句柄錯誤...}'。 –

+0

你必須決定是否'control'創建管道和fork兩次,一次運行'a'和一次運行'b',或者'control'用'a'或'b'中的一個替換它自己,還是「控制」叉子和孩子創建管道,然後叉子和孫子運行一個進程(可以是'a'或'b'),而小孩運行另一個進程,'control'等待孩子完成。一切皆有可能;在沒有其他信息的情況下,尚不清楚是否存在「最佳」解決方案。如果'control'需要做更多的事情,那麼單叉解決方案將不合適。 –

+0

嗨,Jonathan a.c純粹用作示例名,它可能是ex1.c&ex2.c或其他。我試圖做的目標是從a.c(或ex1.c視情況而定)輸入並將它們發送給b.c進行處理和輸出。但經過進一步的研究後,我注意到最好的做法是「創建管道和分叉兩次」的方法,但即時通訊仍在努力理解控制如何控制管道流量 - > b – rowboat

回答

0

您可能想要使用管道和叉子來獲得所需的結果。看看this question的答案。

+0

這真的不是一個答案 - 它應該是一個評論。 –

0

想通了。我試圖用用戶定義的程序運行execvp。其中i稱爲execvp( 「AC,參數)

我的一直在呼籲

execvp(」 ./一」,參數)

新手的錯誤我的道歉