2016-01-24 109 views
0

我知道子進程與fork()調用之前的父進程具有完全相同的文件描述符表副本。假設我只是fork()調用之前打開一個管道,如果在fork()之後使用execv(),子進程是否可以訪問pipe?

pipe(fd[2*i]); 
pipe(fd[2*i+1]); 
pid = fork(); 
if(pid) 
{ 
     strcpy(_args[0], "child"); 
     sprintf(_args[1], "%d", fd[2*i][0]); 
     sprintf(_args[2], "%d", fd[2*i+1][1]); 
     _args[4] = NULL; 
     if(execv(_args[0], _args) == -1) printf("execv error\n"); 
} 

假設孩子是我的孩子的過程,這是整個父和子進程使用管道的合法途徑? (這是我的代碼的實際部分)。

我的程序在執行時'凍結',當我使用SIGTSTP時,我得到/sysdeps/nptl/fork.c - 沒有這樣的文件或目錄。父母和孩子都在同一個目錄中。這裏有什麼問題?

+0

那是*僞代碼*?因爲如果你用'fd'調用['pipe'](http://man7.org/linux/man-pages/man2/pipe.2.html),然後使用'fd'作爲數組的數組,工作得很好。 –

+0

您通常也會關閉每個進程中未使用的文件描述符。 –

+0

@JoachimPileborg編輯了代碼區域。我盲目地複製了我的部分代碼,沒有意識到它會造成混淆。 – devonoober

回答

0

這只是代碼的一部分,因此我可以猜測。如果你創建一個管道,你總是需要一個讀者和一個作家。在你的例子中,我們只看到作者。

你通常在孩子身上做的是通過管道將其連接到父母,覆蓋其標準輸出/輸出。關閉其標準輸入/輸出和DUP()管道FDS,像這樣:

close(0); 
dup(in); // reading end of input pipe 
close(in); // close unused fd 
close(1); 
dup(out); // writing end of output pipe 
close(out);// close unused fd 

這些管的另一端在父分開處理。

+1

不要忘記在'dup'後關閉'in'和'out',特別是如果它們是管道描述符...... –

相關問題