本节书摘来自异步社区《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. 【转载】C#中StreamReader读取中文文本出现乱码的解决方法
  2. zabbix如何监控WEB应用性能
  3. 【LOJ】#2084. 「NOI2016」网格
  4. gcc - lm的含义
  5. iUAP云运维平台v3.0全面支持基于K8s的微服务架构
  6. 计算机网络按拓扑结构可分为三种基本型,2012年计算机三级网络技术基本概念与名词解释(3)...
  7. 烂泥:高负载均衡学习haproxy之安装与配置
  8. kali安装有道词典
  9. 考研复试问题之数据库概论
  10. python3基础教程pdf下载-《Python基础教程》(第3版)pdf电子书百度网盘下载
  11. 【C++】多线程同步
  12. python制表符的作用_Python制表符是什么
  13. 〖产品思维训练白宝书 - 产品思维认知篇⑤〗- 学习 [产品思维] 需要做哪些准备?
  14. 01 | Linux详细简介
  15. 系统卡顿有服务器硬件的原因,服务器出现卡顿,一般是这个3个原因!
  16. 如何在忙碌之余学习数据科学?
  17. 爬虫正则匹配固定长度的数字
  18. Prescan-行人识别
  19. 微信扫描二维码自动跳转到app下载页面(安卓跳转默认浏览器 苹果跳转苹果商店App Store)
  20. WPF Prism框架之Dialog

热门文章

  1. java冒泡法优化_数据结构java版之冒泡排序及优化
  2. Javascript快速排序
  3. 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用
  4. mysql 绑定 cpu 节点_MySQL Cluster(MySQL集群)配置
  5. android return 如何跳出两个循环_关于不得不学的Android知识之消息机制
  6. div中文字居中加粗
  7. Maven和Eclipse整合
  8. VB 屏幕融化超级恶搞程序代码
  9. VB快速查找大型文件中包含的字符串
  10. VB实现指示窗口中拖动方框的程序