2011-09-22 145 views
6

每個進程都有一個文件描述符表(FDT),每個文件都有一個文件描述符。 stdin,stdout和stderr的文件描述符分別爲0,1和2.這些值對於所有進程都是相同的。我相信FDT包含對這些文件的INODE條目的引用。文件描述符在各個進程中重用,即它們不是全局唯一的。 FDT提到的每個進程都有內核維護的全局FDT嗎? stdin,stdout和stderr對應的FDT是什麼?鏈接到鍵盤這些特殊文件,顯示等 請提供鏈接的文章,書籍等Unix中的文件描述符幫助

回答

7

一個很好的出發點是自2001年的文章"A small trail through the Linux kernel"的機制仍然是類似的,雖然實現已經在移動和最好在a more recent kernel研究。

在內核中,每個打開的文件描述符對應於一個struct file,其中包含有關打開的文件或設備的所有信息。文件描述符實際上不過是進程中FDT的索引。在Linux內核中,struct file通過函數fd_install()附加到FDT。 struct file可以通過dup2 system call重新分配給另一個文件描述符。

如果進程是由clone系統調用與CLONE_FILES標誌創建的,但沒有全局FDT,則進程可以共享相同的FDT。正常的fork操作會創建一個新的FDT,它是父FDT的副本。這樣做的實際用途是使多線程應用程序的每個線程成爲共享一個公共FDT的克隆進程,確保所有線程都可以使用相同的整數文件描述符。如果使用fork/exec創建新進程,則新進程將從相同的文件描述符開始,但可以在不影響父級的情況下打開和關閉文件。

stdin,stdout,stderr的FDT條目是從父級繼承的。這三個FDT條目的內核實現沒有什麼特別之處;它們的含義來自C庫的傳統使用。父母過程本身決定他們連接到什麼。它們可能連接到字符設備,或者它們可能已連接到文件或管道。對於字符設備的情況,最正常的是成爲一個tty或pty設備。免費書Linux Device Driversa good overview這些。

+1

在段落3的末尾,我認爲你的意思是一個子進程可以打開和關閉文件而不影響父文件 –