2014-02-27 54 views
0

嗨,有人可以解釋爲什麼我應該關閉我的管道後使用execlp?爲什麼我關閉管道後關閉execlp?

下面是一個例子:

if(cid == 0) 
{//Only child cid can run this code 

    char msg[256]; 

    //Redirect output into the pipe instead of the terminal 
    dup2(pipe1Fds[1],STDOUT_FILENO); 

    //Close pipes or the pipe reader will not get an EOF 
    close(pipe1Fds[0]); 
    close(pipe1Fds[1]); 
    close(pipe2Fds[0]); 
    close(pipe2Fds[1]); 

    //Execute cmd1 
    execlp(cmd1,cmd1,(char *)0); 

    exit(0); 
} 
+0

閱讀[高級Linux編程](http://advancedlinuxprogramming.com/) –

回答

1

execlp()會將不同的代碼加載到此進程中,然後運行新程序,因此您需要在加載目標代碼之前關閉管道,因爲目標代碼不會訪問管道。
你可以閱讀以獲取更多信息link。由於您的代碼將被execlp()加載的程序替換,所以您必須在調用execlp()之前關閉管道。

1

你有dup2倒是管FD到STDOUT FD,所以你不需要它了,需要關閉它(所以它對於一個EOF讀者)。

execlp(如果它有輸出)執行的程序認爲它向STDOUT寫入,但STDOUT FD已更改爲管道FD,所以其寫入管道FD。

+0

'execlp'只是執行一個程序。它不寫任何東西。 –

+0

@BasileStarynkevitch肯定 - 但該程序的執行可能會寫入STDOUT,該STDOUT已被複制到管道FD。我已經編輯來澄清我的陳述。 –