Linux 内核将打开的文件表示为文件描述符表中的条目、v 节点表中的条目以及打开文件表中的条目。
Linux 内核是否以同样的方式表示打开的目录?
可能不是,因为我想知道为什么目录是通过以下方式打开的:
DIR *opendir(const char *pathname);
当文件被打开时:
int open(const char *path, int oflag, ... /* mode_t mode */ );
可能是的,因为
DIR *fdopendir(int fd);
将打开的文件描述符转换为 DIR 结构。那么是否有一些函数(open()
?)可以像打开文件一样打开目录,并返回文件描述符fd
?
是opendir()
通过首先使用open()
获取目录的文件描述符,然后fdopendir()
在文件描述符上调用或某些等效项来实现的吗?
谢谢。
答案1
opendir
是一个在内部调用系统调用的库函数open
,就像fopen
是一个在内部调用open
.opendir
返回指向目录流的指针DIR
,类似于fopen
返回指向文件流的指针FILE
。如果您愿意,还可以open
直接在目录上使用系统调用。
答案2
那么是否有一些函数(
open()
?)可以像打开文件一样打开目录,并返回文件描述符fd?
是的,您可以使用以下命令打开目录open()
并获取它的文件描述符。如果您使用openat()
.
在 Linux 上,您不能read()
从目录中访问,但它会返回EISDIR
, (“是一个目录”)。相反,内核有getdents()
从打开的目录中读取目录条目的系统调用。令人困惑的是,还有过时的readdir()
系统调用(尽管不是在较新的体系结构上),它与同名的 POSIX 函数不同。
正如手册页所说getdents()
,glibc 不提供它的包装器,所以你应该使用POSIXreaddir()
和opendir()
函数代替。所以是的,在内部opendir()
使用时open()
,C 库只是做它需要做的事情,以提供标准 API 和DIR *
.
据我了解,其他一些类似 Unix 的系统read()
也允许在目录上使用,而不是(或者除了?)有一个不同的系统调用来获取文件列表。
Linux的open()
还有一个O_DIRECTORY
标志,如果指定的文件不是目录,则导致打开失败,但使用它不是强制性的。