### 09文件操作篇:C语言经典函数(Linux) #### 一、Close(关闭文件) **函数定义:** ```c #include <unistd.h> int close(int fd); ``` **功能描述:** `close()` 函数用于关闭一个已经打开的文件。通过传递先前由 `open()` 或 `creat()` 函数返回的文件描述符(fd)作为参数,可以实现文件的关闭操作。成功关闭文件后,`close()` 会将所有未写入的数据刷回磁盘,并释放该文件所占用的资源。 **返回值:** - 如果文件成功关闭,则返回 0。 - 发生错误时返回 -1,并设置 `errno` 以指示错误原因。 **错误代码:** - **EBADF:** 参数 `fd` 不是有效的文件描述符,或者文件已经被关闭。 **附加说明:** 尽管在进程终止时,系统会自动关闭所有打开的文件,但推荐开发者显式地关闭文件并检查返回值以确保程序的健壮性。 **示例代码:** 参见 `open()` 示例。 --- #### 二、Creat(建立文件) **函数定义:** ```c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat(const char *pathname, mode_t mode); ``` **功能描述:** `creat()` 函数用于创建一个新的文件。它接受两个参数: - `pathname`: 要创建的文件的路径名。 - `mode`: 新文件的权限模式。 `creat()` 函数等价于使用以下 `open()` 调用: ```c open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode); ``` **返回值:** - 成功创建文件时返回新文件的描述符。 - 失败时返回 -1,并设置 `errno` 以指示错误原因。 **错误代码:** - **EEXIST:** 参数 `pathname` 指向的文件已存在。 - **EACCESS:** 参数 `pathname` 所指定的文件不符合所需的权限。 - **EROFS:** 欲打开写入权限的文件存在于只读文件系统内。 - **EFAULT:** 参数 `pathname` 指针超出可访问的内存空间。 - **EINVAL:** 参数 `mode` 不正确。 - **ENAMETOOLONG:** 参数 `pathname` 太长。 - **ENOTDIR:** 参数 `pathname` 是一个目录。 - **ENOMEM:** 内核内存不足。 - **ELOOP:** 参数 `pathname` 包含过多的符号链接。 - **EMFILE:** 进程已达到可同时打开的最大文件数。 - **ENFILE:** 系统已达到可同时打开的最大文件数。 **附加说明:** `creat()` 不能用于创建特殊的设备文件。如需创建,请使用 `mknod()`。 **示例代码:** 参见 `open()` 示例。 --- #### 三、Dup(复制文件描述符) **函数定义:** ```c #include <unistd.h> int dup(int oldfd); ``` **功能描述:** `dup()` 函数用于复制一个已存在的文件描述符 `oldfd`。复制的描述符指向与 `oldfd` 相同的文件,并共享所有的锁定、读写位置和其他属性。 **返回值:** - 成功时返回最小且尚未使用的文件描述符。 - 发生错误时返回 -1,并设置 `errno` 以指示错误原因。 **错误代码:** - **EBADF:** 参数 `oldfd` 不是有效的文件描述符。 **示例代码:** 略。 --- #### 四、Dup2(复制文件描述符) **函数定义:** ```c #include <unistd.h> int dup2(int oldfd, int newfd); ``` **功能描述:** `dup2()` 函数用于复制一个文件描述符 `oldfd` 到另一个文件描述符 `newfd`。如果 `newfd` 已经被打开,则会先关闭 `newfd`。 **返回值:** - 成功时返回最小且尚未使用的文件描述符。 - 发生错误时返回 -1,并设置 `errno` 以指示错误原因。 **附加说明:** `dup2()` 函数等同于调用 `fcntl(oldfd, F_DUPFD, newfd)`。 **错误代码:** - **EBADF:** 参数 `oldfd` 或 `newfd` 不是有效的文件描述符。 **示例代码:** 略。 --- #### 五、Fcntl(文件描述符操作) **函数定义:** ```c #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); ``` **功能描述:** `fcntl()` 函数提供了多种文件描述符相关的操作,包括但不限于锁定文件、设置文件描述符标志、获取文件状态等。 **参数说明:** - `fd`: 文件描述符。 - `cmd`: 指定的操作命令。 - `...`: 可选参数,根据不同的命令而变化。 **返回值:** - 对于大多数命令,成功时返回非负整数,失败时返回 -1 并设置 `errno`。 - 对于某些命令,如 `F_GETFL` 和 `F_SETFL`,返回值表示当前的文件状态标志。 **命令列表:** - `F_DUPFD`: 为文件描述符 `fd` 创建一个最小且未使用的文件描述符。 - `F_GETFD`: 获取文件描述符 `fd` 的状态标志。 - `F_SETFD`: 设置文件描述符 `fd` 的状态标志。 - `F_GETFL`: 获取文件描述符 `fd` 的状态标志。 - `F_SETFL`: 设置文件描述符 `fd` 的状态标志。 - `F_GETLK`, `F_SETLK`, `F_SETLKW`: 锁定或解锁文件区域。 **示例代码:** 略。 --- ### 总结 以上介绍的几个函数是 C 语言在 Linux 环境下进行文件操作的基础。正确理解和使用这些函数对于编写高效稳定的文件处理程序至关重要。例如,`close()` 用于关闭文件并释放资源,`creat()` 用于创建新文件,而 `dup()` 和 `dup2()` 则用于复制文件描述符,`fcntl()` 提供了更为灵活的文件描述符操作能力。掌握这些函数不仅能帮助开发者更好地控制文件的生命周期,还能提高程序的性能和可靠性。






























- 粉丝: 223
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- MPC模型预测控制在Matlab Simulink与Carsim联合仿真的参数配置及应用
- 以太网PHY电路设计详析:基于Gpdk90nm与Gpdk180nm工艺的系统级电路设计及关键模块解析
- MATLAB仿真光伏电池12V升压至48V双闭环Boost电路控制策略及9A电流输出
- 三相全桥型并联APF有源电力滤波器的PI与重复控制及SVPWM调制仿真研究 完整版
- 光伏板太阳能充电MATLAB仿真与双闭环控制Boost电路研究
- 永磁同步电机三矢量模型预测电流控制:基于PI控制器的电流给定与期望电压矢量合成优化
- 基于蜣螂优化算法求解分布式置换流水车间调度问题及其应用 详细版
- 定位助手_202507251.apk
- 基于蜣螂优化算法求解置换流水车间调度问题(PFSP)并绘制甘特图 智能优化算法
- MATLAB环境下振动与声音信号解卷积方法研究:冲击信号提取及工程应用
- 基于MI-UKF多新息无迹卡尔曼滤波的电池电量SOC估算方法与性能研究
- 永磁同步电机双矢量MPC模型预测电流控制:提升动态性能与减少电流波动的技术解析
- 利用星鸦优化算法(NOA)求解FJSP问题及'MK01'算例甘特图演示
- 基于遗传算法求解混合流水车间调度问题的MATLAB实现及甘特图展示
- 基于ADRC控制的半车主动悬架建模及其与PID控制效果对比的研究 - MATLABSimulink v3.5
- PVD真空预压与FLAC3D数值模拟:四根竖向排水板在软土地基处理中的应用研究 - PVD真空预压


