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
英文地址,請注明出處:http://en.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. 查看數據庫創…