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上下载的系统镜像有问题,经过各种搜索后,成功地在网
系统测试系统测试是将已经继承好的软件系统,作为计算机系统的一个元素,与计算机硬件、某些支持软件、数据和人员等其他系统元素结合
在过去很长一段时间内,中国普通老百姓的热门投资产品主要是银行存款、银行理财产品、股市、房产。但这些传统的金融投资产品,在当
在建站成为各个企业、商家必备的一步之后,大家都需要建设自己的网站。但由于人工成本、时间成本来说,采用自助建站更受广大企业青睐