Linux中关闭文件的接口

在Linux系统中,关闭文件主要通过以下接口实现:


1. 系统调用 close()

最底层、最直接的方法,用于关闭文件描述符(File Descriptor)。

1
2
#include <unistd.h>
int close(int fd); // fd:文件描述符

返回值

  • 成功返回 0
  • 失败返回 -1,并设置 errno(如 EBADF 表示无效描述符)。

示例

1
2
3
4
5
int fd = open("file.txt", O_RDWR);
// ... 操作文件 ...
if (close(fd) == -1) {
perror("close failed");
}


2. C标准库函数 fclose()

用于关闭文件流FILE* 类型),内部会自动刷新缓冲区并调用 close()

1
2
#include <stdio.h>
int fclose(FILE *stream); // stream:文件流指针

返回值

  • 成功返回 0
  • 失败返回 EOF(通常是 -1)。

示例

1
2
3
4
5
FILE *file = fopen("file.txt", "r");
// ... 操作文件 ...
if (fclose(file) == EOF) {
perror("fclose failed");
}


3. 其他相关接口

  • closefrom() (Linux特有):
    关闭从指定描述符开始的所有文件描述符(>= lowfd)。

    1
    2
    #include <unistd.h>
    void closefrom(int lowfd);

    示例closefrom(3); // 关闭所有描述符 ≥3。

  • close_range() (Linux 5.9+ 新增):
    灵活关闭指定范围内的描述符。

    1
    2
    #include <linux/close_range.h>
    int close_range(unsigned int first, unsigned int last, unsigned int flags);

    示例close_range(3, 100, 0); // 关闭描述符 3~100。


关键注意事项

  1. 资源释放
    关闭文件会释放内核资源(如文件描述符、缓冲区内存),未关闭可能导致资源泄漏。

  2. 自动关闭
    进程结束时,所有打开的文件会被内核自动关闭,但显式关闭是良好实践。

  3. 错误处理
    始终检查返回值,避免忽略错误(如磁盘写满时 fclose() 刷新缓冲区可能失败)。

  4. 缓冲区刷新
    fclose() 会刷新C库缓冲区,而 close() 不会(直接操作描述符)。确保重要数据在 close() 前显式调用 fsync()


选择建议

  • 操作文件描述符int fd) → 用 close()
  • 操作文件流FILE*) → 用 fclose()
  • 批量关闭描述符 → 用 closefrom()close_range()

通过正确关闭文件,可确保系统资源高效利用并避免数据丢失。