Linux系统编程-文件IO操作
文件描述符(File Descriptor)
在 Linux 中,所有打开的文件都通过文件描述符(非负整数)来标识。默认的三个文件描述符:
- 0:标准输入(STDIN)
- 1:标准输出(STDOUT)
- 2:标准错误(STDERR)
类型:int
范围:0 ~ 1023,每个进程最多允许打开 1024 个文件/资源。
打开文件:open()
功能:打开或创建一个文件,并返回文件描述符。
函数原型:
1 |
|
参数说明:
pathname
:文件路径flags
:打开方式(必须包含且只能包含以下之一)O_RDONLY
:只读O_WRONLY
:只写O_RDWR
:读写- 可选标志:
O_CREAT
(创建文件)、O_TRUNC
(清空文件)、O_APPEND
(追加模式)等
mode
:当使用O_CREAT
时,指定新文件的权限(如0644
)
返回值:
- 成功:文件描述符
- -1:出错
关闭文件:close()
功能:关闭已打开的文件描述符,释放资源。
函数原型:
1 |
|
返回值:
- 0:表示文件描述符已成功关闭,相关资源被释放。
- -1:出错
读取文件:read()
功能:从文件描述符中读取数据。
函数原型:
1 |
|
参数说明:
fd
:文件描述符buf
:存储读取数据的缓冲区count
:要读取的字节数
返回值:
- 成功:实际读取的字节数(可能小于
count
) - 0:已到达文件末尾
- -1:出错
写入文件:write()
功能:向文件描述符写入数据。
函数原型:
1 |
|
参数说明:
fd
:文件描述符buf
:要写入的数据缓冲区count
:要写入的字节数
返回值:
- 成功:实际写入的字节数
- -1:出错
文件定位:lseek()
功能:修改文件的当前读写位置(类似标准库的fseek
)。
函数原型:
1 |
|
参数说明:
offset
:偏移量whence
:基准位置SEEK_SET
:从文件开头开始计算SEEK_CUR
:从当前位置开始计算SEEK_END
:从文件末尾开始计算
返回值:
- 成功:新的文件偏移量
- -1:出错
1 | // 移动到文件开头 |
创建文件:creat()
功能:创建一个新文件(等价于open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)
)。
函数原型:
1 |
|
示例:
1 | int fd = creat("newfile.txt", 0644); // 创建权限为644的新文件 |
复制文件描述符:dup() 和 dup2()
功能:复制已有的文件描述符,常用于重定向标准输入 / 输出。
函数原型:
1 |
|
示例:
1 | // 将标准输出重定向到文件 |
同步写入:fsync()
功能:将文件缓冲区的数据强制写入磁盘(确保数据持久化)。
函数原型:
1 |
|
示例:
1 | write(fd, data, len); |
示例程序
1 |
|
注意事项:
- 所有 I/O 函数出错时返回 - 1,并设置全局变量
errno
,可通过perror()
打印错误信息。 - 这些是无缓冲 I/O(系统调用),与 C 标准库的
fopen
/fread
/fwrite
(带缓冲)不同。 - 文件操作完成后必须调用
close()
释放资源,否则可能导致文件描述符泄漏。
通过这些基础操作,可以组合实现复杂的文件处理功能,如文件复制、数据解析、日志记录等。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cokode' Blog!