每個進程都有一個文件描述符表(FDT),每個文件都有一個文件描述符。 stdin,stdout和stderr的文件描述符分別爲0,1和2.這些值對於所有進程都是相同的。我相信FDT包含對這些文件的INODE條目的引用。文件描述符在各個進程中重用,即它們不是全局唯一的。 FDT提到的每個進程都有內核維護的全局FDT嗎? stdin,stdout和stderr對應的FDT是什麼?鏈接到鍵盤這些特殊文件,顯示等 請提供鏈接的文章,書籍等Unix中的文件描述符幫助
6
A
回答
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 Drivers有a good overview這些。
相關問題
- 1. UNIX文件描述符重用
- 2. 瞭解Unix文件描述
- 3. WebApi幫助頁面描述
- 4. 文件描述符飢餓和阻斷文件描述符
- 5. Unix Shell在C - 文件描述符中實現Cat問題
- 6. 如何在unix中創建阻塞文件描述符?
- 7. 文件描述符是在Unix上是其本地進程還是全局文件描述符
- 8. 對UNIX文件描述符的短寫操作
- 9. FullCalendar和qTip。幫助描述爲數組
- 10. c strcpy文件描述符
- 11. webservice描述符文件
- 12. 關閉文件描述符
- 13. 創建文件描述符
- 14. Linux open()文件描述符
- 15. 實現文件描述符
- 16. 文件描述符輪詢
- 17. 寫作文件描述符
- 18. Android中的持久文件描述符
- 19. Java(android)中socket.io的文件描述符?
- 20. UNIX守護進程處理文件描述符
- 21. 非阻塞文件描述符Unix網絡編程
- 22. 如何使用sdbus發送Unix文件描述符?
- 23. 瞭解UNIX管道和文件描述符
- 24. 有關文件的Unix幫助
- 25. 套接字描述符與文件描述符
- 26. 文件描述符和套接字文件描述符之間的區別
- 27. 壞文件描述符文件無
- 28. 文件描述符和打開文件
- 29. unix打開文件,用於寫入給定的文件描述符
- 30. 等待可讀文件描述符和可寫文件描述符
在段落3的末尾,我認爲你的意思是一個子進程可以打開和關閉文件而不影響父文件 –