Linux close函数怎么用?linux关闭文件描述符方法

在 Linux 系统编程中,close() 是一个至关重要的系统调用,用于关闭一个打开的文件描述符(file descriptor)。

以下是关于 close() 函数的详细解析,包括原型、行为、返回值、常见陷阱以及最佳实践。

Linux系统编程:open/close函数详解
加载中
Linux系统编程:open/close函数详解

函数原型

#include <unistd.h>
int close(int fd);
  • 参数fd 是要关闭的文件描述符。
  • 返回值
    • 成功时返回 0
    • 失败时返回 -1,并设置 errno 以指示错误原因。

核心行为

当调用 close(fd) 时,内核执行以下操作:

  1. 引用计数检查

    • 每个打开的文件描述符在内核中都有一个引用计数。
    • 如果该描述符是通过 dup()fork() 共享的,关闭它只会减少引用计数,不会立即释放底层资源。
    • 只有当引用计数降为 0 时,内核才会真正释放该文件描述符占用的资源(如文件偏移量、打开文件状态标志等)。
  2. 释放资源

    • 如果引用计数为 0,内核会:
      • 释放文件描述符槽位(使其可被新打开的文件复用)。
      • 如果这是最后一个指向该打开文件表项的描述符,内核会执行

        Linux close函数怎么用?linux关闭文件描述符方法

        关闭操作(如刷新缓冲区、通知文件系统更新 inode 等)。

  3. 标准文件描述符

    • close(0) 关闭标准输入(stdin)。
    • close(1) 关闭标准输出(stdout)。
    • close(2) 关闭标准错误(stderr)。
    • 关闭这些描述符后,后续的 I/O 操作可能会失败或行为未定义,除非重新打开它们。

常见错误与 errno

错误码 含义 常见原因
EBADF 文件描述符无效 fd 不是有效的打开文件描述符(可能已关闭、从未打开或值非法)
EINTR 系统调用被信号中断 关闭操作被信号中断(罕见,但需处理)
EIO I/O 错误 底层文件系统或设备发生错误

最佳实践与注意事项

✅ 始终检查返回值

if (close(fd) == -1) {
    perror("close failed");
    // 根据程序逻辑决定是否退出或继续
}

✅ 关闭后不再使用

  • 关闭文件描述符后,不要再对该 fd 进行任何操作(如

    Linux close函数怎么用?linux关闭文件描述符方法

    read, write, lseek),否则会导致 EBADF 错误。

  • 建议将 fd 设为 -1 作为标记:
    close(fd);fd = -1; // 防止误用

✅ 处理 EINTR

虽然 close() 很少被信号中断,但在编写健壮代码时,应处理 EINTR

while (close(fd) == -1 && errno == EINTR) {
    // 被信号中断,重试
}
if (errno != 0) {
    perror("close failed");
}

✅ 与 dup()fork() 的关系

  • fd 是通过 dup(fd) 创建的,关闭其中一个副本不会影响另一个副本对底层文件的访问。
  • fork() 之后,子进程继承父进程的文件描述符,关闭父进程中的 fd 不会影响子进程中的副本,反之亦然。

✅ 资源泄漏

  • 忘记关闭文件描述符会导致资源泄漏(文件描述符耗尽、内存泄漏等)。
  • 在长时间运行的服务中,这可能导致程序崩溃或拒绝服务。

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main() {
    int fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
       

Linux close函数怎么用?linux关闭文件描述符方法

perror("open failed"); return 1; } // 使用 fd 进行 read/write 操作... // 关闭文件描述符 if (close(fd) == -1) { perror("close failed"); return 1; } // 防止误用 fd = -1; printf("File closed successfully.n"); return 0; }

常见问题 FAQ

Q: close() 会删除文件吗?
A: 不会close() 只是关闭文件描述符,释放内核资源,要删除文件,应使用 unlink() 系统调用。

Q: 关闭标准输出(close(1))后,printf 还能用吗?
A: 不能printf 默认写入标准输出(fd 1),关闭后,printf 会失败或行为未定义,如果需要重定向输出,应先使用 dup2() 将新文件描述符复制到 fd 1。

Q: 如何确保文件数据已写入磁盘?
A: close() 会触发内核将缓冲区中的数据刷新到磁盘(通过 fsync() 机制),但不能保证物理磁盘已写入,如需强一致性,应在 close() 前调用 fsync(fd)


close() 是 Linux 文件 I/O 的基础操作,正确管理文件描述符的生命周期(打开 → 使用 → 关闭)是编写稳定、安全 C 程序的关键,务必检查返回值、处理错误,并避免资源泄漏。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/477760.html

(0)
什么是floorplan?floorplan和户型图有什么区别
上一篇 2026年7月10日 02:57
heatmapmin.js是什么?heatmap.min.js怎么用
下一篇 2026年7月10日 02:58

相关推荐

  • 国外业务中台服务热门吗?国外业务中台服务哪家好

    在全球数字化转型的浪潮中,企业构建敏捷IT架构已成为生存发展的关键,国外业务中台服务热门的现象,本质上反映了全球企业从“烟囱式”系统建设向“共享服务架构”转型的必然趋势,其核心价值在于通过复用能力中心,实现业务能力的快速编排与敏捷响应,从而大幅降低重复建设成本并提升市场响应速度, 核心驱动力:为何国外企业纷纷拥……

    2026年3月3日
    14100
  • Apache服务器配置报错怎么办?Apache服务器配置教程

    Apache服务器配置的核心在于精准修改httpd.conf或apache2.conf文件,通过合理设置虚拟主机、权限控制及模块加载,即可实现高性能、高安全的Web服务部署,很多刚接触服务器运维的朋友,一听到“配置”两个字就头大,觉得那是资深架构师才干的活,Apache作为老牌Web服务器,其配置逻辑非常直观……

    2026年6月7日
    4200
  • Linux管道大小是多少?Linux pipe缓冲区大小限制

    Linux管道(Pipe)的默认大小通常为64KB,但可通过pipe2系统调用或调整/proc/sys/fs/pipe-max-size参数进行扩展,最大可达数百MB甚至GB级别,具体取决于内核版本和系统配置,管道是Linux进程间通信(IPC)的核心机制之一,它像一条隐形的数据高速公路,允许一个进程的输出直接……

    2026年7月8日
    3900
  • 打印机服务器怎么设置IP地址才正确?,多少钱一台?

    打印机服务器设置IP地址,最直接的方式是通过设备面板或Web管理界面进行手动配置,费用上,局域网内使用私有IP没有额外成本,而公网固定IP则需要向服务商租赁,月费通常在几十元到几百元,具体取决于服务商资质和线路等级,打印机服务器设置IP地址的详细操作步骤通过打印机液晶面板设置如果打印机自带屏幕和按钮,操作最直观……

    2026年8月5日
    800
  • Linux httpd怎么下载?httpd服务安装配置教程

    在Linux环境下下载并安装Apache HTTP Server(httpd)最稳妥的方式是通过各发行版自带的包管理器(如yum或apt)获取官方预编译版本,而非从官网直接下载源码编译,这样能确保依赖关系完整且维护成本最低,为什么选择官方包管理器而非源码编译?很多刚接触Linux的新手朋友,看到Apache官网……

    2026年7月5日
    11010
  • Linux鼠标设置怎么调?linux鼠标左键右键设置

    在Linux系统中,鼠标设置的核心在于通过图形界面“设置”应用进行基础调整,或通过命令行工具xinput与libinput驱动进行底层参数定制,以实现从基础指针速度到高级手势的精准控制,很多刚接触Linux的朋友会发现,系统自带的鼠标设置选项相对简陋,无法满足对DPI(每英寸点数)微调、滚动惯性或侧键映射的精细……

    2026年7月5日
    7800
  • asp门户网站系统_登录系统网站,asp门户网站系统怎么登录?

    构建一个安全、高效且易于维护的用户认证模块,是ASP门户网站系统成功运营的基石,在当前数字化转型的浪潮中,登录系统网站不仅仅是用户进入平台的“大门”,更是数据安全的第一道防线、用户画像的入口以及业务逻辑的起点,一个优秀的ASP登录系统,必须在保障数据库安全交互的前提下,实现毫秒级的响应速度,并为后续的权限管理打……

    2026年4月4日
    9400
  • 酷番云16核32G云服务器多少钱?,性价比高吗?

    16核32G云服务器在腾讯云的月租费用通常在1200元至2500元之间,具体取决于实例规格、带宽大小和购买时长,通过年付或新用户优惠可显著降低, 实际选型时,除了价格,还需关注服务商的资质和机房稳定性,持牌自营机房往往提供更可靠的服务,16核32G云服务器的典型应用场景16核32G的配置在云计算领域属于中高端机……

    2026年8月24日
    000
  • linux notepad怎么安装?linux下好用的文本编辑器推荐

    在Linux系统中安装文本编辑器并非单一操作,通常推荐通过包管理器安装Vim、Nano或Geany,具体选择取决于你是需要极简命令行工具还是具备图形界面的现代化编辑器,很多刚接触Linux的朋友,听到“Notepad”这个词,第一反应是Windows里那个简单的记事本,但在Linux的世界里,没有直接名为“No……

    2026年7月9日
    3400
  • 达拉斯物理服务器托管真的低至$29.95吗?达拉斯VPS最低配多少钱

    NextArray达拉斯物理服务器托管低至$29.95/月,最低配达拉斯VPS仅需$1.99/月,这是目前北美市场极具性价比的低成本算力解决方案,达拉斯VPS价格优势解析:$1.99/月能做什么在北美云计算市场中,达拉斯(Dallas)一直被视为高性价比节点的代表,对于预算敏感型用户,尤其是独立开发者、小型初创……

    2026年7月5日
    3700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • 陈红
    陈红 2026年7月10日 16:35

    三点睡不着…这文章挺硬核。不过close了fd最好检查下返回值啊,不然资源泄漏了半夜找bug真的会谢…困死