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()系统调用来结束所有的连接。

==================== 以下是广告 ====================

更多系统详尽的Linux系统编程内容,欢迎订阅GitChat专栏 《攻克Linux系统编程》

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐