readdir函数是用于读取目录内容的系统调用,它返回一个指向dirent结构体的指针。dirent结构体包含了关于目录中条目的信息。以下是dirent结构体的详细解释:
struct dirent {
long d_ino; // inode号
off_t d_off; // 偏移量
unsigned short d_reclen; // 名称长度
unsigned char d_type; // 文件类型
char d_name[]; // 文件名(以null结尾)
};
d_ino:
longd_off:
off_treaddir调用以继续读取下一个条目。d_reclen:
unsigned shortd_name字段的实际长度。d_type:
unsigned charDT_REG: 普通文件DT_DIR: 目录DT_LNK: 符号链接DT_BLK: 块设备文件DT_CHR: 字符设备文件DT_FIFO: 管道(FIFO)DT_SOCK: 套接字d_type可能不被支持或返回DT_UNKNOWN。d_name:
char[]d_reclen指定。以下是一个简单的示例,展示如何使用readdir函数读取目录内容:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *entry;
if (argc != 2) {
fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
return EXIT_FAILURE;
}
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
while ((entry = readdir(dir)) != NULL) {
printf("Inode: %ld, Name: %s, Type: %d\n", entry->d_ino, entry->d_name, entry->d_type);
}
closedir(dir);
return EXIT_SUCCESS;
}
在这个示例中,程序打开一个目录并逐个读取其条目,打印每个条目的inode号、名称和类型。
readdir函数返回的dirent结构体是由内核分配的,因此不需要手动释放内存。d_name字段的长度可能小于d_reclen指定的长度,因此在处理文件名时应小心。d_type字段可能不被支持,返回DT_UNKNOWN。通过理解dirent结构体的各个字段,可以更有效地处理目录中的文件和子目录。