2016-12-02 34 views
0

我想在c中創建一個linux守護進程,並發現一些sample code on this page重定向STDIN/OUT/ERR

我瞭解所有的代碼,除了它試圖重定向STDIN,STDOUT和STDERR(到/ dev/null /)。我還在這裏找到了一些關於的問題,爲什麼這些應該重定向(我知道)。

具體的代碼我的問題涉及部分是:

/* Route I/O connections */ 

/* Open STDIN */ 
i = open("/dev/null", O_RDWR); 

/* STDOUT */ 
dup(i); 

/* STDERR */ 
dup(i); 

man page for dup()它意味着dup()簡單地複製一個文件描述符。

所以我不明白這是怎麼做的重定向?編譯器是從上面的行中的註釋中獲得提示嗎?或者它是否遺漏了一些代碼?是錯誤的嗎?或者我錯過了什麼?

+2

這是否例子在創建新的STDIN,STDOUT和STDERR之前關閉現有的STDIN,STDOUT和STDERR?因此,下一個免費的fd使用將是0,然後1,然後2 – infixed

+1

可能重複[重定向STDIN,STDOUT,STDERR到/ dev/null在C](http://stackoverflow.com/questions/4263173/redirecting -stdin-標準輸出-stderr的至DEV-空在-c)的 –

回答

1

它的進口,以瞭解您鏈接到的示例代碼的前一位:

/* close all descriptors */ 
     for (i = getdtablesize(); i >= 0; --i) 
     { 
      close(i); 
     } 

這將關閉所有打開的文件描述符,包括STDINSTDOUTSTDERR

由於聯機幫助頁open()狀態

成功調用返回的文件描述符將是編號最低的文件描述符目前沒有開放的過程

所以後續調用open()在示例代碼中,將文件描述符0STDIN)重定向到/dev/null

dup()的後續調用將使用下一個最小號碼複製文件描述符。 STDOUT1STDERR2

dup()狀態的手冊頁:

的DUP()系統調用創建的文件描述符oldfd的副本,使用編號最小的未使用的描述符新的描述符

1

從DUP的手冊頁:

的DUP(oldfd)系統調用創建使用新的描述符編號最低的未使用的描述符的文件描述符oldfd, 的副本。

如果你看到的引用代碼,他首先關閉所有打開的文件描述:

 for (i = getdtablesize(); i >= 0; --i) 
     { 
      close(i); 
     } 

後,當你調用dup(i),它將文件描述符我複製到最低描述符,這將是0(stdin)。再次執行該操作會將其複製到描述符1(stdout),對描述符2(stderr)也是如此。這樣,守護進程的stdin,stdoutstderr指向/dev/null

每個進程獲得三個打開的​​文件描述符,分別是stdin,stdoutstderr(這些描述符通常分別具有值0,1和2)。例如,當您撥打printf()時,它會寫入stdout描述符指向的文件。通過將此描述符指向另一個文件(如/dev/null),此過程的任何輸出都將被重定向到該文件。相同的邏輯適用於stdinstderr

在shell上,當您運行類似ls > ls.out的東西時,shell的功能相同。它fork()是一個新的進程,打開ls.out進行寫入,並調用dup(或dup2)將文件描述符ls.out複製到此進程的stdout。