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.pswp.cn/news/916616.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HBuilder X打包发布微信小程序

一、获取AppId 二、获取微信小程序AppId 三、发行->微信小程序&#xff0c;调起微信开发者工具 四、点击上传,上传至微信公众平台 五、微信公众平台查看版本管理 完结&#xff01;&#xff01;&#xff01;

docker排查OOM

思路&#xff1a; 1.先从代码程序上排查&#xff0c;线程池创建是否使用ThreadPoolExecutor&#xff0c;线程池各项设置是否合理。 任务对象是否释放&#xff0c;网关是否需要限流。 2.服务器内存大小&#xff0c;cpu使用率&#xff0c;存储空间大小&#xff0c;java程序启动…

Web后端进阶:springboot原理(面试多问)

1.配置优先级 3种配置文件: application.properties server.port8081application.yml server:port: 8082application.yaml server:port: 80822种外部属性的配置(Java系统属性、命令行参数): Java系统属性配置 &#xff08;格式&#xff1a; -Dkeyvalue&#xff09; -Dserver.po…

第十天:字符菱形

每日一道C题&#xff1a;字符菱形 问题&#xff1a;给定一个字符&#xff0c;用它构造一个对角线长5个字符&#xff0c;倾斜放置的菱形。 要求&#xff1a;输入只有一行&#xff0c; 包含一个字符&#xff1b;输出该字符构成的菱形。 最基础的做法&#xff1a; #include <io…

Qt 多线程编程最佳实践

在现代软件开发中&#xff0c;多线程编程是提升应用性能和响应性的关键技术。Qt 作为一个强大的跨平台框架&#xff0c;提供了丰富的多线程支持&#xff0c;包括 QThread、QtConcurrent、信号槽机制等。本文将深入探讨 Qt 多线程编程的最佳实践&#xff0c;帮助开发者避免常见陷…

Photo Studio PRO 安卓版:专业级照片编辑的移动解决方案

Photo Studio PRO 安卓版是一款功能强大的专业级照片编辑应用&#xff0c;旨在为用户提供丰富而强大的编辑工具和特效&#xff0c;帮助用户轻松地对照片进行美化和修饰。无论是摄影爱好者还是专业摄影师&#xff0c;都能通过这款应用实现从基础调整到高级合成的全流程编辑。 核…

2025高考志愿怎么填?张雪峰最新“保底”推荐来了!这4个专业专科也能拿高薪,毕业不愁!

专业选得好&#xff0c;就业跑不了&#xff01;2025年高考落幕&#xff0c;现在是决战未来的关键时刻&#xff0c;选专业比选学校更重要&#xff01; 今天&#xff0c;学长就根据张雪峰老师多次力荐、再结合2024年就业大数据&#xff0c;给大家盘点4个紧缺人才专业&#xff0c…

C++初学者4——标准数据类型

先导&#xff1a; 目录 一、整形 二、浮点型 &#xff01;保留指定小数位数 三、布尔类型 关系运算 逻辑运算 ​C逻辑运算四句口诀​ 四、字符型 ASCll码 C中的字符表示 字符比较 ASCII中的常用转换 大小写转换 转换成0~25 五、数据类型隐式转换 ​1. 隐式转…

HCIP的MGRE综合实验1

拓扑图&#xff1a;二、实验要求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有Ip地址;2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2与R5之间使用PPP的CHAP认证&#xff0c;R5为主认证方;R3与R5之间使用HDLC封装;3、R2、R…

Go语言实战案例-链表的实现与遍历

在数据结构的世界中&#xff0c;链表&#xff08;Linked List&#xff09; 是一种经典的线性结构&#xff0c;它以灵活的插入与删除能力著称。链表不像数组那样需要连续的内存空间&#xff0c;而是通过节点指针连接形成一条“链”。本篇我们将使用 Go 语言实现一个单向链表&…

C++常见的仿函数,预定义函数,functor,二元操作函数(对vector操作,加减乘除取余位运算等 )

C 标准库在 <functional> 头文件中为我们提供了一套非常方便的预定义函数对象&#xff08;也称为“仿函数”或 “functor”&#xff09;&#xff0c;它们可以像变量一样直接传递给 std::reduce 和其他标准算法。 你提到的 std::bit_or 和 std::multiplies 就是其中的成员…

【RH134 问答题】第 6 章 管理 SELinux 安全性

目录SELinux 是如何保护资源的&#xff1f;什么是自由决定的访问控制(DAC)&#xff1f;它有什么特点&#xff1f;什么是强制访问控制(MAC)&#xff1f;它有什么特点&#xff1f;什么是 SELinux 上下文&#xff1f;setenforce 0 命令的作用是什么&#xff1f;定义一条 SELinux 文…

【MacOS】发展历程

很高兴为您详细介绍 macOS 的详细发展历程。macOS 是苹果公司开发的操作系统&#xff0c;用于 Mac 电脑、iPad 和 Apple TV 等设备。以下是 macos 的主要版本和发展历程&#xff1a;1. System 7 (1991)发布日期&#xff1a;1991年特点&#xff1a;引入多任务处理功能。改进了拖…

智慧社区项目开发(二)——基于 JWT 的登录验证功能实现详解

在 Web 应用中&#xff0c;登录验证是保障系统安全的核心环节。本文将结合具体接口文档&#xff0c;详细讲解如何基于 JWT&#xff08;JSON Web Token&#xff09;实现登录验证功能&#xff0c;包括 JWT 配置、工具类封装、登录流程处理等关键步骤&#xff0c;帮助开发者快速理…

Jmeter的元件使用介绍:(七)后置处理器详解

Jmeter的后置处理器主要用于取样器执行后的提取数据操作。 Jmeter常用的后置处理器有:Json提取器、正则表达式提取器、边界提取器、Beanshell后置处理器。此外还有Xpath提取器、CSS选择器提取器等&#xff0c;由于这两项多用前端页面提取元素&#xff0c;目前的项目基本都是采…

Allure的安装,在Pytest中的简单使用以及生成测试报告

目录 1.Allure的安装 1--下载网址 2--选择对应系统版本下载 3--配置Allure环境变量 4--验证安装是否成功 5--配置JAVAJDK的环境变量&#xff08;如果已经配置&#xff0c;可以忽视这一步&#xff09; 2.python中pytestAllure 1--python安装Allure包 2--生成测试报告 1--使用pyt…

Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程

Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程 7月26日下午&#xff0c;某医院用户的 HIS 系统无法连接&#xff0c;报如下错误&#xff1a;初步判断是归档日志问题。 用户的 HIS 系统数据库是双节点 Oracle 11g Rac 集群。登录服务器…

ArKTS:List 数组

一种&#xff1a;/**# encoding: utf-8# 版权所有 2025 ©涂聚文有限公司™ # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎# 描述&#xff1a; 数组# Author : geovindu,Geovin Du 涂聚文.# IDE : DevEco Studio 5.1.1 …

Spring Boot 3整合Spring AI实战:9轮面试对话解析AI应用开发

Spring Boot 3整合Spring AI实战&#xff1a;9轮面试对话解析AI应用开发 第1轮&#xff1a;基础配置与模型调用 周先生&#xff1a;cc&#xff0c;先聊聊Spring AI的基础配置吧。如何在Spring Boot 3项目中集成Ollama&#xff1f; cc&#xff1a;我们可以通过OllamaConfig.java…

标准SQL语句示例

一、基础操作1. 数据库操作-- 1. 创建数据库 CREATE DATABASE 数据库名称 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 2. 删除数据库 DROP DATABASE IF EXISTS 数据库名称;-- 3. 选择数据库 USE 数据库名称;-- 4. 显示所有数据库 SHOW DATABASES;-- 5. 查看数据库创…