![getdents() 系统调用内部如何工作?](https://linux22.com/image/182047/getdents()%20%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E5%86%85%E9%83%A8%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我最近开始研究 Linux 的源代码,以便从头开始创建我自己的 POSIX 操作系统。据我了解,类 UNIX 系统上的所有内容都是文件。任何可以从中读取字节或写入字节的内容都可以抽象为“流”。但在这里我偶然发现了一个互联网上似乎没有人关心的问题(至少我没有找到任何解释它的内容):Linux 到底在幕后做了什么来将所有内容作为文件进行管理?
我的问题可能不清楚,所以这里有一个我想了解的示例:当您在 shell 中键入“ls -l”时,它不仅列出存储在磁盘上的物理文件,还列出块和字符设备、链接,以及其他不是存储在磁盘上的文件的东西。它是如何工作的?
预先感谢,戴夫。
答案1
请注意,从头开始编写 POSIX 操作系统远远超出了本站点的范围。另请注意,标题和实际问题不匹配。
如果你想知道getdents
系统调用在 Linux 中是如何工作的,请查看代码,似乎你已经对其他部分做了同样的事情。但getdents
并不是那么重要,早期的 UNIX 系统没有它。引入该getdents
功能是为了支持不同的文件系统。
关于实际问题,您的误解似乎是该ls
命令列出了文件,但它列出了目录条目。 UNIX 中的目录条目可以引用文件,也可以引用目录、命名管道和设备。字符和块设备条目是内核中不同驱动程序的接口。它们包含一个用于标识驱动程序的数字,以及另一个用于标识同一驱动程序处理的不同设备的数字。
较新的系统也支持文件系统套接字,但整个套接字概念并不是原始 UNIX 设计的一部分。套接字不是文件,“一切都是文件”指的是最初的 UNIX 设计。但是一旦设置了套接字,它们就支持一些也适用于文件的操作。
您可以继续研究源代码,但我建议您在开始编写自己的系统之前先了解一下 POSIX 系统。