2014-03-07 134 views
12

這實際上是一個兩步的問題:是否EXEC保存文件描述符

  1. 到底什麼是文件描述符?我認爲這是表示一個打開文件的最基本的方式。但是由於dup2可以使兩個不同的文件描述符指向同一個文件,那麼它代表一個獨特的文件是什麼?

  2. 如果我在exec之前做了dup2,那麼整個程序就會被清除掉,它是否仍然有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?

回答

12

。打開文件描述符在對exec的調用中保留。從execve man page(所有exec*來電都只是圍繞這個系統調用的包裝):

默認情況下,文件描述符保持跨越execve()開放。標記爲close-on-exec的文件描述符已關閉;請參閱FD_CLOEXEC的說明fcntl(2)

  1. 是的,file descriptor是的方式,用戶空間進行系統調用時指打開的文件。 (或套接字,或管道等)它們可以被複制的事實不會改變這一點。它們只是對同一個打開文件的多個引用。另請參見:

  2. 是的,在手冊頁的報價提及。

事實上,很多程序(包括你的shell)都依賴於這個特性。如果不是這樣,你的程序將在沒有標準輸入/輸出/錯誤文件描述符的情況下啓動!當shell運行一個程序時,它的fork s,dup2的open tty文件描述符爲0,1,2,然後execve是你的新程序。

+2

+1:此外,當您fork()時,每個描述符都被複制,並且子文件中的文件描述符指向與父文件中相應文件描述符相同的打開文件描述。 'dup()'和'dup2()'給你另一個參考文件的描述。請參閱POSIX(和相關頁面)的['open()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html)手冊頁。 –