必威体育Betway必威体育官网
当前位置:首页 > IT技术

Linux系统调用 - close

时间:2019-10-24 01:15:44来源:IT技术作者:seo实验室小编阅读:63次「手机版」
 

close

close系统调用的功能很直接,就是关闭一个已经打开的文件。函数原型:

int close(int fd);

fd就是之前用open()获得的一个文件描述符。

在内核中,打开的文件会被维护一个引用计数,每次close()会把文件的引用计数减一,引用计数减少到0的文件才会从内核中释放资源

close()成功执行后会返回0,否则返回-1,同时失败原因会被记录在errno中。常见的错误原因有:

EBADF:fd不是有效的文件描述符

EINTR:close()被某个信号处理程序中断

EIO:关闭文件时发生了IO错误

调用close()而不检查返回值的代码非常常见,但是严格的说,这其实是个严重的编程错误,因为之前的write()操作也可能会导致close()的失败,如果就这样忽略close()的操作结果可能会导致数据的丢失,在NFS或者有限额的磁盘上尤其常见。

一次成功的close()并不会总是保证所有的数据都会被刷新到磁盘上去,因为内核会延迟写。如果要在close()时需要保证所有的数据都已经保存到磁盘,要使用fsync()系统调用。

另外,需要注意的是,close()的操作对象是文件描述符,它是一个能被重用的整数,所以,如果需要在多线程中操作一个文件,那在多线程中用这个文件描述符来应用该文件不是个好主意,如果一个线程中关闭了文件,然后重新打开的另一个文件重用了同一个整数文件描述符,那么在另外一个线程中就会操作到错误的文件。

另外,如果要使用close()操作套接字,需要确保当前没有其他线程阻塞在该套接字的recv()上,因为该套接字关闭之后另外一个线程会永远收不到任何消息,从而永远阻塞在那里。这种情况下,应该先用shutdown()系统调用来结束所有的连接。

文章最后发布于: 2018-10-23 23:08:05

相关阅读

常见面试题整理(操作系统)

(一)请分别简单说一说进程和线程以及它们的区别。进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调

装系统时提示:无法打开所需文件,错误代码0x8007000D,如何

先看看错误代码的截图吧当时装系统时,用软碟通试了几次,都是这个效果,以为是在MSDN上下载的系统镜像有问题,经过各种搜索后,成功地在网

系统测试

系统测试系统测试是将已经继承好的软件系统,作为计算机系统的一个元素,与计算机硬件、某些支持软件、数据和人员等其他系统元素结合

p2p网贷系统告别死工资 为自己增加收入渠道

在过去很长一段时间内,中国普通老百姓的热门投资产品主要是银行存款、银行理财产品、股市、房产。但这些传统的金融投资产品,在当

快速建站系统选哪个好?

在建站成为各个企业、商家必备的一步之后,大家都需要建设自己的网站。但由于人工成本、时间成本来说,采用自助建站更受广大企业青睐

分享到:

栏目导航

推荐阅读

热门阅读