当前位置: 首页 > news >正文

getdents64系统调用及示例

getdents64 函数详解

1. 函数介绍

getdents64 是 Linux 系统中用于读取目录内容的底层系统调用。可以把这个函数想象成一个"目录内容扫描仪"——它能够高效地扫描目录中的所有文件和子目录,就像超市的扫描枪快速读取商品条码一样。

与高级的目录操作函数(如 readdir)不同,getdents64 是最底层的接口,直接与内核交互,提供了最大的灵活性和性能。它返回的是原始的目录项数据,包含文件名、inode 号、文件类型等信息。

2. 函数原型

#include <dirent.h>     /* 或者 <unistd.h> */
#include <sys/syscall.h>int getdents64(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count);

3. 功能

getdents64 函数用于从已打开的目录文件描述符中读取目录项(directory entries)。它一次可以读取多个目录项,比逐个读取效率更高。

4. 参数

  • fd: 已打开的目录文件描述符(通过 open()opendir() 获得)
  • dirp: 指向缓冲区的指针,用于存储读取的目录项数据
  • count: 缓冲区的大小(以字节为单位)

5. struct linux_dirent64 结构体

struct linux_dirent64 {ino64_t        d_ino;    /* 64位 inode 号 */off64_t        d_off;    /* 到下一个目录项的偏移 */unsigned short d_reclen; /* 此目录项的长度 */unsigned char  d_type;   /* 文件类型 */char           d_name[]; /* 文件名(以 null 结尾) */
};

6. 文件类型(d_type 字段)

类型值 宏定义 说明
0 DT_UNKNOWN 未知类型
1 DT_FIFO 命名管道
2 DT_CHR 字符设备
4 DT_DIR 目录
6 DT_BLK 块设备
8 DT_REG 普通文件
10 DT_LNK 符号链接
12 DT_SOCK 套接字

7. 返回值

  • 成功: 返回实际读取的字节数(0 表示到达目录末尾)
  • 失败: 返回 -1,并设置相应的 errno 错误码

常见错误码:

  • EBADF: fd 不是有效的目录文件描述符
  • EFAULT: dirp 指针无效
  • EINVAL: 参数无效
  • ENOENT: 目录不存在

8. 相似函数或关联函数

  • getdents: 旧版本的目录读取函数(32位 inode)
  • readdir: POSIX 标准的目录读取函数(更高级的接口)
  • opendir/fdopendir: 打开目录
  • closedir: 关闭目录
  • scandir: 扫描目录并排序
  • ls: 命令行目录列表工具

9. 示例代码

示例1:基础用法 - 读取目录内容

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/syscall.h>
#include <dirent.h>
#include <string.h>// 目录项结构体(64位版本)
struct linux_dirent64 {ino64_t        d_ino;    /* Inode number */off64_t        d_off;    /* Offset to next structure */unsigned short d_reclen; /* Size of this structure */unsigned char  d_type;   /* File type */char           d_name[]; /* Filename (null-terminated) */
};// 获取文件类型字符串
const char* get_file_type_string(unsigned char d_type) {switch (d_type) {case DT_REG:  return "普通文件";case DT_DIR:  return "目录";case DT_LNK:  return "符号链接";case DT_CHR:  return "字符设备";case DT_BLK:  return "块设备";case DT_FIFO: return "命名管道";case DT_SOCK: return "套接字";case DT_UNKNOWN: default:      return "未知";}
}// 获取文件类型字符
char get_file_type_char(unsigned char d_type) {switch (d_type) {case DT_REG:  return 'f';case DT_DIR:  return 'd';case DT_LNK:  return 'l';case DT_CHR:  return 'c';case DT_BLK:  return 'b';case DT_FIFO: return 'p';case DT_SOCK: return 's';case DT_UNKNOWN: default:      return '?';}
}int main(int argc, char *argv[]) {int fd;char buf[4096];int nread;char *dir_path;// 获取目录路径参数if (argc != 2) {printf("用法: %s <目录路径>\n", argv[0]);dir_path = ".";  // 默认当前目录printf("使用当前目录: %s\n\n", dir_path);} else {dir_path = argv[1];}// 打开目录fd = open(dir_path, O_RDONLY | O_DIRECTORY);if (fd == -1) {perror("open");return 1;}printf("=== 目录 '%s' 的内容 ===\n", dir_path);printf("%-12s %-10s %-8s %s\n", "INODE", "类型", "大小", "名称");printf("%-12s %-10s %-8s %s\n"
http://www.dtcms.com/a/302759.html

相关文章:

  • 搭建HAProxy高可用负载均衡系统
  • 四、计算机组成原理——第2章:数据的表示和运算
  • OpenLayers 综合案例-动态闪烁
  • YOLO11 改进、魔改|低分辨率自注意力机制LRSA ,提取全局上下文建模与局部细节,提升小目标、密集小目标的检测能力
  • Python将Word转换为Excel
  • eclipse更改jdk环境和生成webservice客户端代码
  • Linux应用管理与YUM/DNF指南
  • 迅为RK3568开发板OpeHarmony学习开发手册-配置电源管理芯片和点亮HDMI屏幕-配置电源管理芯片
  • ARM share memory
  • 智慧工地系统:科技赋能建筑新未来
  • 电子签章(PDF)
  • 阿里云可观测 2025 年 6 月产品动态
  • 【机器学习-4】 | 集成学习 / 随机森林篇
  • 以科力锐为例介绍常见的数据中心4种灾备方式
  • HDFS Block与Spark的partition对比
  • MCU+RTOS调试
  • unisS5800XP-G交换机配置命令之端口篇
  • 经典算法题解析:从思路到实现,掌握核心编程思维
  • 分布式数据库中的“分布式连接”(Distributed Joins)
  • YOLOv8 基于RTSP流目标检测
  • 【C++详解】深入解析继承 类模板继承、赋值兼容转换、派生类默认成员函数、多继承与菱形继承
  • 把振动数据转成音频并播放
  • Kubernetes --存储入门
  • 实时YOLO目标检测与跟踪系统设计
  • [蓝牙通信] 临界区管理 | volatile | 同步(互斥锁与信号量) | handle
  • 谷歌浏览器深入用法全解析:解锁高效网络之旅
  • UVA11990 ``Dynamic‘‘ Inversion
  • kotlin基础【3】
  • 第一章:Go语言基础入门之流程控制
  • Power Query合并数据