当前位置:首页 > 技术 > 正文内容

Linux系统编程中的文件操作核心头文件与数据类型详解

访客 技术 2026年8月26日 1

文件创建基础

在Linux系统编程中,文件操作是最基础的功能之一。创建文件的核心函数原型如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *path, mode_t perm_mode);

sys/types.h:系统基础数据类型定义

该头文件定义了系统级编程中广泛使用的多种基础数据类型,是编写可移植系统程序的关键依赖。

核心数据类型一览

  • off_t:文件偏移量类型,表征文件内部位置指针的字节位移,在lseek等定位操作中不可或缺。
  • ssize_t:带符号尺寸类型,主要用于read、write等I/O操作的返回值,表示实际传输字节数或错误状态。
  • size_t:无符号尺寸类型,常用于内存分配、数组长度等场景,如malloc参数和sizeof运算结果。
  • mode_t:文件权限与状态标识类型,在open、chmod等权限相关调用中作为参数。
  • dev_t:设备标识类型,在inode结构中区分不同硬件设备。
  • ino_t:inode编号类型,文件系统内每个文件的唯一数字标识。
  • blksize_t:文件系统块尺寸类型,用于I/O优化的块大小描述。
  • time_t:时间戳类型,记录秒级时间信息。
  • id_t:通用标识类型,涵盖uid_t和gid_t等身份标识。

代码示例:获取文件元信息

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    int file_desc = open("demo.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (file_desc < 0) {
        perror("文件打开失败");
        return 1;
    }

    struct stat file_info;
    if (fstat(file_desc, &file_info) != 0) {
        perror("状态获取失败");
        close(file_desc);
        return 1;
    }

    off_t file_bytes = file_info.st_size;
    printf("文件占用空间: %ld 字节\n", (long)file_bytes);

    close(file_desc);
    return 0;
}

sys/stat.h:文件状态与类型常量

文件类型宏定义

  • S_IFREG:常规文件,最常见的存储形式。
  • S_IFDIR:目录文件,组织文件层级结构。
  • S_IFCHR:字符设备文件,对应字符流式硬件设备。
  • S_IFBLK:块设备文件,对应块存储硬件如磁盘。
  • S_IFIFO:命名管道文件,支持进程间数据传递。
  • S_IFLNK:符号链接文件,指向其他文件的路径引用。
  • S_IFSOCK:套接字文件,用于网络或本机进程间通信。

struct stat 结构体

struct stat {
    dev_t     st_dev;      // 文件所在设备编号
    ino_t     st_ino;      // inode节点编号
    mode_t    st_mode;     // 文件类型与权限位
    nlink_t   st_nlink;    // 硬链接计数
    uid_t     st_uid;      // 属主用户ID
    gid_t     st_gid;      // 属组ID
    dev_t     st_rdev;     // 特殊文件的设备标识
    off_t     st_size;     // 文件字节总长度
    blksize_t st_blksize;  // 文件系统I/O块尺寸
    blkcnt_t  st_blocks;   // 分配的512字节块数
    time_t    st_atime;    // 最近访问时间戳
    time_t    st_mtime;    // 最近内容修改时间戳
    time_t    st_ctime;    // 最近元数据变更时间戳
};

关键函数说明

stat():通过路径名获取文件元信息,填充至stat结构体。

lstat():与stat类似,但不跟随符号链接,直接返回链接自身信息。

fstat():基于已打开的文件描述符获取状态信息。

chmod():修改文件或目录的访问权限位。

access():检测当前进程对文件的访问能力。

fcntl.h:文件描述符控制接口

该头文件提供了文件描述符级别的控制能力,包括标志管理、文件锁定等功能。

fcntl函数

int fcntl(int fd, int cmd, ... /* arg */);

常用命令参数:

  • F_GETFL:读取当前文件状态标志。
  • F_SETFL:修改文件状态标志,常用于切换非阻塞模式。
  • F_GETLK / F_SETLK / F_SETLKW:文件记录锁的获取、设置与阻塞式设置。

flock函数

int flock(int fd, int operation);

operation可取值包括LOCK_SH(共享锁)、LOCK_EX(独占锁)、LOCK_UN(释放锁)等。

文件打开标志(O_*系列)

  • O_RDONLY:只读模式打开。
  • O_WRONLY:只写模式打开。
  • O_RDWR:读写双工模式打开。
  • O_CREAT:文件不存在时自动创建。
  • O_TRUNC:以写方式打开时将文件清零。
  • O_APPEND:写入操作定位至文件尾部。
  • O_NONBLOCK:以非阻塞方式操作文件。

unistd.h:POSIX标准系统调用集合

该头文件封装了大量与文件和进程管理相关的POSIX标准接口。

核心函数分类

文件描述符管理

  • close():关闭文件描述符,释放系统资源。
  • dup() / dup2():复制文件描述符,实现重定向。

文件读写操作

  • read():从文件描述符读取数据到缓冲区。
  • write():将缓冲区数据写入文件描述符。

文件与目录操作

  • open():打开或创建文件,返回描述符。
  • creat():创建文件(已被open的O_CREAT取代)。
  • mkdir():创建目录。
  • unlink():删除文件名引用。
  • link() / symlink():创建硬链接或符号链接。
  • getcwd():获取进程当前工作目录路径。

进程管理

  • fork():创建子进程,复制父进程地址空间。
  • exec()系列:用新程序替换当前进程映像。
  • pipe():创建匿名管道用于亲缘进程间通信。
  • wait() / waitpid():阻塞等待子进程状态变化。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。