【发布时间】:2010-09-17 13:27:10
【问题描述】:
在 Kernighan 和 Ritchie 编写的 “The C Programming Language” 第二版中,他们实现了 UNIX 命令ls 的简化版本(第 8.6 节 “示例 - 列出目录”,第 179 页)。为此,他们创建了以下接口,该接口提供了对存储在目录中的文件的名称和 inode 号的独立于系统的访问。
#define NAME_MAX 14 /* longest filename component; */
/* system dependent */
typedef struct { /* portable director-entry */
long ino; /* inode number */
char name[NAME_MAX+1]; /* name + '\0' terminator */
} Dirent;
typedef struct { /* minimal DIR: no buffering, etc. */
int fd; /* file descriptor for directory */
Dirent d; /* the directory entry */
} DIR;
DIR *opendir(char *dirname);
Dirent *readdir(DIR *dfd);
void closedir(DIR *dfd);
然后他们为版本 7 和 System V UNIX 系统实现此接口。
opendir()基本用系统 致电open()打开目录并malloc()为 a 分配空间DIR结构。文件描述符 然后存储open()返回的 在那个DIR的变量fd中。Dirent中没有存储任何内容 组件。readdir()使用系统调用read()获取下一个 (系统相关的)目录条目 打开的目录并复制so 获得inode编号和文件名 进入静态Dirent结构(到 返回一个指针)。这 唯一需要的信息readdir()是文件描述符 存储在DIR结构中。
现在我的问题:拥有DIR 结构有什么意义?如果我对这个程序的理解是正确的,DIR 的Dirent 组件是从不使用的,那为什么不用文件描述符替换整个结构,直接使用open() 和close()?
谢谢。
Ps:我知道在现代 UNIX 系统上 read() 不能再用于目录(我已经在 Ubuntu 10.04 上试用过这个程序),但我仍然想确保我没有忽略一些重要的东西这个例子。
【问题讨论】: