本节书摘来自异步社区《Linux系统编程(第2版)》一书中的第2章,第2.6节,作者:【美】Robert Love著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 关闭文件

当程序完成对某个文件的操作后,可以通过系统调用close()取消文件描述符到对应文件的映射:

系统调用close()会取消当前进程的文件描述符fd与其关联的文件之间的映射。调用后,先前给定的文件描述符fd不再有效,内核可以随时重用它,当后续有open()调用或creat()调用时,重新把它作为返回值。close()调用在成功时返回0,出错时返回-1,并相应设置errno值。close()的用法很简单:

值得一提的是,关闭文件操作并非意味着该文件的数据已经被写到磁盘。如果应用希望保证关闭文件之前数据已经写入磁盘,它需要使用先前在2.4节中讨论的同步选项。

关闭文件虽然操作上很简单,但是也会带来一些影响。当关闭指向某个文件的最后一个文件描述符时,内核中表示该文件的数据结构就释放了。如果释放了数据结构,会清除和文件相关的索引节点的内存拷贝。如果已经没有内存和索引节点关联,该索引节点也会被从内存中清除(出于性能考虑,也可能会保存在内核中,但也可能不需要)。如果文件已经从磁盘上解除链接,但是解除之前还一直打开,在文件被关闭并且其索引节点从内存中删除之后,该文件才会真正从物理磁盘上删除。因此,调用close()可能会使得一个已解除链接的文件最终从磁盘上删除。

错误码
一个常见的错误是没有检查close()的返回值。这样做可能会遗漏严重错误,因为延迟操作相关的错误可能到了后期才出现,而close()的返回值早就给出了这些错误信息。在失败时,有很多可能的errno值。除了EBADF(给定的文件描述符不合法),最重要的错误码是EIO,表示底层I/O错误,该错误很可能和实际的close操作并不相关。如果忽略出现的错误,在合法情况下,文件描述符总是关闭的,而且相关的数据结构也都释放了。

close()调用绝不会返回EINTR,虽然POSIX标准允许。Linux内核开发者可能很清楚,返回EINTR并不合适。

《Linux系统编程(第2版)》——2.6 关闭文件相关推荐

  1. linux目录统计编程,linux系统编程----统计一个目录下的普通文件个数

    主要是为了统计linux系统下一个指定目录下面的普通文件个数,运用目录操作的一些函数,配合递归调用来实现该功能. 首先介绍一下函数原型: 打开一个空目录 DIR *opendir(const char ...

  2. Linux系统编程:树莓派 ds18b20温度获取(文件IO相关操作)

    文章目录 问题 解答 linux文件io操作文件夹 1.opendir() 2.readdir() 3.closedir() 4.open() 5.read()函数 问题 当树莓派配置好ds18b20 ...

  3. Linux系统编程:获取指定目录下指定文件类型的数量

    分析 编程实现对指定目录下的指定文件类型数量的统计.这里涉及到对目录文件的打开和对目录文件下的文件的遍历. 这里主要用的2个库函数,打开目录的 opendir函数,readdir函数.对这2个库函数不 ...

  4. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  5. Linux系统编程总结

    day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...

  6. Linux系统编程——进程基础知识

    Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...

  7. Linux系统编程及应用——ubuntu环境下

    Linux系统编程及应用--ubuntu环境下 程序由业务逻辑和系统访问两部分构成的.其中,业务逻辑是根据业务需求,按照设计好的逻辑规则,处理信息,与系统(平台)无关的:而系统访问则是利用操作系统所提 ...

  8. Linux系统编程-基本命令

    Linux系统编程-基本命令 目录 1.学习目标 2.Linux/Unix操作系统简介 2.1 Linux操作系统的目标(了解) 2.2 Linux操作系统的作用(了解) 2.3 Unix家族 (了解 ...

  9. 【Linux】Linux系统编程(入门与系统编程)(一)(环境搭建、常见指令以及权限理解)

    目录 linux系统编程 : 1.推动技术进步的基本模式 2.理解操作系统的发展 Linux 背景介绍 UNIX发展的历史: Linux发展历史 开源 Linux的发行版本: a.技术角度 b.商业化 ...

最新文章

  1. 图解GPT-2(完整版)!
  2. 一款IDEA插件神器,帮你一键转换DTO、VO、BO、PO、DO
  3. python字典更新值_Python 字典 update() 使用方法及示例
  4. [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
  5. Linux 操作系统基础知识
  6. mysql 字段a减字段b_SQL 数据库 如何实现第一行字段A减字段B得到值C,然后再用C减去第二行字段B,以此类推,求高手解答...
  7. TCP/IP网络协议栈:IP协议
  8. JAVA时间格式处理工具类
  9. QuickGUI编辑器系列---从文件中读取并解析
  10. Java基础编程经典练习题
  11. ak4495驱动linux源码,解码芯片由一片变成两片后——升级双AK4495S芯片的香榭丽舍一体机...
  12. 用python画蜡笔小新_用python画的蜡笔小新
  13. 微量小程序联盟,如何实现微信小程序换量和微信小程序推广?
  14. [实践篇]13.12 教你读懂QNX座舱方案里的高频术语
  15. libtool-2.4.6-9-x86_64.pkg.tar.xz无法下载
  16. mysql值locate()、position()、instr() 函数
  17. 数电课设之一路交通灯
  18. Java面试java基础,重庆java哪家培训班好
  19. 风云四号圆盘数据转等经纬工具
  20. 教你正确进入DFU及恢复模式 无敌重刷模式

热门文章

  1. ccd视觉定位教程_CCD与CMOS哪个更能推动工业相机市场的发展
  2. 实现前后台数据交互(上传/回传单个JSON数据和上传/回传JSON数组)
  3. linux打包压缩文件并命名,linux下如何将文件打包、压缩并分割成制定大小
  4. Mysql存储过程老是报错_mysql中看看这个存储过程老是报错,该如何处理
  5. 微信 html关闭当前页
  6. 再说过程和结果的关系
  7. VB移动没有标题的窗体
  8. 第3章 FOR命令中的变量
  9. 技术分析在于少而精,多则惑
  10. 《2018中国AI计算力发展报告》发布!北京算力仅排第二