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://idctop.com/linux-close%e5%87%bd%e6%95%b0%e6%80%8e%e4%b9%88%e7%94%a8%ef%bc%9flinux%e5%85%b3%e9%97%ad%e6%96%87%e4%bb%b6%e6%8f%8f%e8%bf%b0%e7%ac%a6%e6%96%b9%e6%b3%95/

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

相关推荐

  • Linux Oracle Admin怎么配置?Linux Oracle数据库管理员入门

    Linux环境下Oracle数据库管理员的核心价值在于通过自动化运维与深度性能调优,保障高并发业务下的数据一致性与系统稳定性,而非简单的日常巡检,在数字化转型的深水区,企业对于底层数据架构的依赖程度呈指数级上升,作为连接操作系统与数据库引擎的关键角色,Linux Oracle Admin不再仅仅是安装补丁的技术……

    2026年7月6日
    19300
  • 简米云服务器ECS续费到底多少钱,到期怎么续费更便宜?

    阿里云服务器ECS续费价格没有统一标准,以最常用的2核4G配置为例,年费通常在数百元到两千元之间波动,但续费阶段无法享受新用户特有的折扣价,实际支付金额往往比首次购买高出不少,很多用户盯着续费账单时心里犯嘀咕:当初买的时候那么便宜,怎么续费一下就贵了?这其实是阿里云定价策略决定的,新用户首购有大幅补贴,而续费则……

    2026年10月6日
    100
  • 王者一个服务器到底多少区,各区人数分布一样吗?

    王者荣耀的一个服务器并不是单个区,而是指一个大区,每个大区下包含若干小区,具体数量少则几十个,多则上百个,且随版本更新持续增加,很多玩家在登录游戏时,会看到“微信1区”“QQ5区”之类的入口,这些数字对应的“区”隶属于更高一级的“服务器”,也就是我们常说的大区,搞清楚大区与小区的关系,才能准确理解“一个服务器多……

    2026年10月20日
    200
  • linux网络控制怎么设置?linux系统网络配置命令详解

    Linux网络控制的核心在于利用iptables/nftables进行包过滤、NAT转换以及tc进行流量整形,通过精细化的规则配置实现安全隔离与带宽管理,在服务器运维和网络安全领域,网络控制不仅仅是配置IP地址那么简单,它更像是一个交通指挥系统,你需要决定哪些数据包可以通行,哪些需要被拦截,以及当道路拥堵时如何……

    2026年7月8日
    1700
  • 腾讯的服务器值多少钱,网上哪里能查到真实价格?

    腾讯的服务器资产是一笔公开市场上买不到的天价数字,账面价值以数十亿计算,但真正值钱的不是那堆金属和芯片,而是它背后那套跑得飞快的调度系统和多年攒下的技术家底,先别急着抬杠,这个结论不是瞎拍脑袋,咱们把”值多少钱”拆成两个问题来看:一是硬件本身值多少钱,二是这套体系值多少钱,前者能算,后者算不出来,但可以看见,腾……

    相关资讯 2026年10月22日
    000
  • 堵刀片服务器到底多少钱,哪里买价格更优惠?

    刀片服务器托管价格没有一口价,按机箱位、带宽和电力三要素综合计费,常规单台刀片托管月付在2000元至4000元区间;但刀片机箱起摊费用高,独立机箱托管月成本普遍在5000元以上,刀片服务器在IDC行业里属于“块头小、胃口大”的存在,它密度高、计算力猛,但散热和供电要求也挑剔,机房不是随便找个机柜塞进去就能跑,很……

    相关资讯 2026年11月4日
    000
  • 一台2u服务器一年用多少电?,每月电费多少钱?

    一台2U服务器一年的耗电量通常在3000度到8000度之间,对应电费约2000元到6000元,具体取决于配置、负载率和当地电价,2u服务器功耗一般多少?功率范围与典型配置2U服务器是机架式设备,功耗因硬件组合差异很大,业内专家指出,2U服务器的额定功率通常在300W到800W之间,但实际运行功耗取决于CPU型号……

    2026年7月25日
    700
  • 服务器造价多少钱才合理,怎么选配置更划算?

    服务器造价一般多少钱?一台能稳定跑业务的服务器,总成本通常在几千元到几十万元之间,具体取决于你是自购硬件自建机房,还是租用云服务器/IDC托管,对于多数中小企业来说,租用持牌服务商的高防云主机,年预算1万到5万就能搞定核心业务**,远比自建机房的隐性成本划算,先拆解:服务器造价到底由什么组成很多朋友一上来就问……

    2026年10月4日
    000
  • TBC怀旧服转服到底要花多少钱,怀旧服转服费用标准是多少?

    TBC怀旧服角色转服务器的基础费用为120元(约合15美元),这是暴雪官方定价的角色转移服务费,不含任何额外代充溢价,如果你正在纠结转服值不值、有没有隐藏成本、怎么操作最划算,这篇内容直接给你拆开讲透,转服费用的官方定价与构成在TBC怀旧服中,角色转移服务由暴雪官方统一计价,价格透明但渠道有别,很多玩家在游戏内……

    2026年9月16日
    100
  • 服务器tcp到底能连多少客户端,怎么提高并发连接数

    没有固定上限,一台Linux服务器的TCP并发连接数完全可以做到几万、几十万,甚至百万级,具体数字由文件描述符、内存、内核参数、带宽和CPU处理能力共同决定,而不是TCP协议本身给你画了条死线,先搞清楚连接数由谁说了算第一个闸门:文件描述符在Linux里,每个TCP连接都对应一个socket文件描述符,你连接数……

    2026年9月26日
    100

发表回复

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

评论列表(1条)

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

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