2015-11-19 23 views
3

存在這些後來的「DUP2」呼叫在android源碼Linux的INIT.C文件,我發現這個代碼:爲什麼android系統中的啓動代碼

static void open_console() 
{ 
    int fd; 
    if ((fd = open(console_name, O_RDWR)) < 0) { 
     fd = open("/dev/null", O_RDWR); 
    } 
    ioctl(fd, TIOCSCTTY, 0); 
    dup2(fd, 0); 
    dup2(fd, 1); 
    dup2(fd, 2); 
    close(fd); 
} 

來源: Link to android source

打開控制檯後設備成功地執行一些fork操作,然後繼續複製前三個文件描述符,然後關閉它們(因爲關閉一個會關閉它們)並退出。

這是什麼目的?爲什麼我要確保分配給0,1,2的文件描述符是否接近?

回答

1

正如您可能知道0,1和2的文件描述符是stdin,stdoutstderrdup2只是獲取一個打開的文件描述符,並創建一個重複的條目到文件描述符表中(並且如果它已經打開,也關閉新的文件描述符)。

關閉fd一旦它們被複制也不會導致關閉文件描述符0,1和2。所以你最初的假設看起來是錯誤的 - 你不會結束這些描述符,而是將它們重定向到該控制檯描述符。之後,fd因爲不再需要而被關閉 - stdin,stdoutstderr都映射到控制檯或/dev/null

+0

謝謝!我認爲它已經關閉,因爲它們的偏移被鏈接了,但我想我沒有檢查它。 – sagivd

相關問題