### 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()` 提供了更为灵活的文件描述符操作能力。掌握这些函数不仅能帮助开发者更好地控制文件的生命周期,还能提高程序的性能和可靠性。
- 粉丝: 221
- 资源: 27
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助