如果使用EIO关闭(2)系统调用失败,文件描述符是否仍会被删除?
如果是,通过稍后重试是否无法处理虚假IO错误?如果不是,应该如何防止文件描述符泄漏?
答案 0 :(得分:12)
这是一个棘手的问题。但是,POSIX标准确实在close()
:
如果close()被要捕获的信号中断,它将返回-1,并且errno设置为[EINTR]并且未指定fildes的状态。如果在close()期间读取或写入文件系统时发生I / O错误,则可能返回-1,并将errno设置为[EIO];如果返回此错误,则不指定fildes的状态。
因此,标准未指定文件描述符的状态。
出于大多数实际目的,它已经关闭;即使文件描述符正式打开,你也无法使用文件描述符。您可以尝试无害的操作(如fcntl()
和F_GETFL
)并查看是否返回EBADF,表明描述符已正式关闭。但是如果它是开放的并且EIO错误的原因是永久性的,那么每次你尝试对它做任何事情时你都可能得到EIO(可能包括fcntl()
调用)。您可能会或可能不会获得由另一个类似开放操作返回的相同描述符。目前尚不清楚,如果死文件描述符是打开但不可关闭的,即使dup2()
可以成功指定'死'文件描述符作为目标。