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

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

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

2.6 关闭文件

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

screenshot

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

screenshot

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

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

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

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

相关文章
|
4天前
|
Linux
【Linux系统编程】基础指令(二)(下)
【Linux系统编程】基础指令(二)
|
4天前
|
Linux C语言
【Linux系统编程】基础指令(二)(上)
【Linux系统编程】基础指令(二)
|
2天前
|
Linux
Linux文件误删恢复
请注意,成功恢复误删文件的机会取决于多个因素,包括文件被删除后经过的时间、磁盘的使用情况以及您采取的操作。因此,尽可能快速采取行动,并避免在误删文件所在的磁盘上写入新数据,以提高恢复成功的可能性。
6 0
|
3天前
|
存储 监控 Linux
|
3天前
|
安全 Linux
【亮剑】如何在Linux使用 chattr 命令更改文件或目录的扩展属性?
【4月更文挑战第30天】`chattr`是Linux中用于管理文件和目录扩展属性的命令,影响文件系统处理方式。常用属性包括:`a`(追加)、`i`(不可变)、`s`(安全删除)和`S`(同步更新)。通过`chattr [选项] <模式> <文件或目录>`设置属性,如`chattr +i <文件名>`使文件不可变,`-i`移除不可变属性。`lsattr`用于查看属性。注意,只有root用户有权更改属性,不是所有文件系统都支持所有属性,且更改关键文件属性前应备份。`chattr`有助于提升系统安全性和数据保护。
|
3天前
|
Linux 开发者
【亮剑】Linux 中的文件锁定命令:flock、fcntl、lockfile、flockfile
【4月更文挑战第30天】本文介绍了Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件。flock适合脚本,fcntl提供底层灵活性,lockfile用于管理锁定文件,flockfile则结合两者功能。选择锁定策略时需考虑应用场景,如脚本可选flock,复杂需求则用fcntl。理解并正确使用这些工具对保证系统稳定性和数据一致性至关重要。
|
4天前
|
存储 算法 Linux
【Linux】文件打包解压_tar_zip
【Linux】文件打包解压_tar_zip
14 0
【Linux】文件打包解压_tar_zip
|
4天前
|
Linux 开发者
【Linux】:文件查看 stat、cat、more、less、head、tail、uniq、wc
【Linux】:文件查看 stat、cat、more、less、head、tail、uniq、wc
13 1
|
4天前
|
存储 Unix Linux
【Linux系统编程】基础指令(三)
【Linux系统编程】基础指令(三)
|
4天前
|
Linux
【Linux系统编程】基础指令(一)(下)
【Linux系统编程】基础指令(一)