2016-11-18 83 views
1

我有一個非常具體的問題,在無數次搜索後我無法找到答案。我有一個Linux程序。當它通過網絡接收到特定消息時,它的工作是啓動另一個輔助可執行文件(通過fork()exec())。我無權修改輔助可執行文件。使用fork和exec啓動進程,同時將stdout重定向到/ dev/null

我的程序將所有的TTY打印到標準輸出,我通常通過./program > output.tty啓動它。我遇到的問題是第二個可執行文件非常冗長。它同時打印到標準輸出,同時也將相同的TTY放入日誌文件中。所以我的output.tty文件最終包含兩個輸出流。

我該如何設置,使輔助可執行文件的TTY被重定向到/dev/null?我無法使用system(),因爲我無法等待子進程。我需要能夠開火併忘記。

謝謝。

+0

'exec()'一個調用程序並重定向它的輸出的shell。 –

+0

你不能在'exec()'中使用'>'重定向操作符作爲參數嗎? – SkrewEverything

+0

@SkrewEverything號重定向操作符由shell解釋。 –

回答

3

在子進程中使用dup2()將輸出重定向到文件。

int main(int argc, const char * argv[]) { 

    pid_t ch; 
    ch = fork(); 
    int fd; 
    if(ch == 0) 
    { 
     //child process 

     fd = open("/dev/null",O_WRONLY | O_CREAT, 0666); // open the file /dev/null 
     dup2(fd, 1);          // replace standard output with output file 
     execlp("ls", "ls",".",NULL);      // Excecute the command 
     close(fd);           // Close the output file 
    } 

    //parent process 

    return 0; 
} 
+0

感謝您的評論。我將來會記住這一點。 – mdevico

+0

@mdevico這應該是被接受和正確的答案。 –

+0

@πάνταῥεῖ你是對的。感謝SkrewEverything和Jonathan Leffler。 – mdevico

1

在子進程中,在調用exec之前,需要關閉標準輸出流。

pid_t pid =fork(); 
if (pid == 0) { 
    close(1); 
    // call exec 
} else if (pid > 0) { 
    // parent 
} 
+0

謝謝。我會試試這個。 – mdevico

+0

它工作得很好!我不知道你可以關閉標準輸出。再次感謝。 – mdevico

+2

程序有權使'stdout'打開並可用。最好關閉當前的標準輸出並打開'/ dev/null'進行寫入。 –