Linux系统编程中的文件操作核心头文件与数据类型详解
文件创建基础
在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():阻塞等待子进程状态变化。