Linux 是否以与打开文件相同的方式表示打开的目录?

Linux 是否以与打开文件相同的方式表示打开的目录?

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标志,如果指定的文件不是目录,则导致打开失败,但使用它不是强制性的。

相关内容