2012-11-21 31 views
1

我有一個程序forks(),並且子進程被另一個進程替換,比如說A,它通過調用execv(A)來運行。如何重定向A的輸出爲/dev/null重定向以execv開頭的進程到/ dev/null

我試過到目前爲止: (手柄差錯部分的照顧,並沒有出現錯誤)

pid = fork(); 
    //check for errors 
    if (pid<0){ 
        //handle error 
    } 
    //the child process runs here 
    if (pid==0){ 
     fd = open("/dev/null", O_WRONLY); 
     if(fd < 0){ 
         //hadnle error 
     } 
     if (dup2(fd, 1) != 1) { 
         //handle error 
     } 
     if (execv(lgulppath.c_str(),args)<0){ 
      //handle error 
     } 
    } 

但是,可以理解是不行的,因爲它重定向子進程的輸出到/dev/null而不是處理A的,以後替換孩子輸出。

任何想法? (我沒有A的過程的代碼)

感謝

+0

您的代碼看起來是正確的。你從哪裏得到一個錯誤?你爲什麼說「這可以理解不起作用」? –

+0

@OlafDietsche,注意在execv之前調用open和dup2,當調用open和dup2時,它們將子進程的輸出重定向到/dev/null.However,當execv被調用時它將替換子進程,並且進程A (替換子進程的那個)現在將輸出到stdout而不是/ dev/null –

+0

@ user1432779'execv'替換可執行映像。它不_更改任何打開的文件。 'dup2'將標準設置爲'/ dev/null',這不會被'execv'改變。 –

回答

1

一種可能是,進程A寫入stderr,而不是stdout

然後您必須改爲dup2(fd, 2)

如果進程A寫入stdoutstderr,你必須dup2()兩個:

if (dup2(fd, 1) < 0) { 
    // error handling 
} 

if (dup2(fd, 2) < 0) { 
    // error handling 
} 
+0

,你是什麼意思? –

+1

標準輸出和標準錯誤有兩個不同的文件描述符:1和2.如果進程A寫入兩者,則必須重定向兩者(使用兩個'dup2')。 (另外,通常認爲使用'STDOUT_FILENO'和'STDERR_FILENO',而不是'1'和'2',在政治上更爲正確。) –

+0

@JamesKanze和Olaf,好吧我讀了關於dup2和yeah 2是stderr fd。謝謝:-) –

相關問題