Linux系统调用 - 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()
系统调用来结束所有的连接。
==================== 以下是广告 ====================
更多系统详尽的Linux系统编程内容,欢迎订阅GitChat专栏 《攻克Linux系统编程》
更多推荐
所有评论(0)