如果close(2)与EIO失败,文件描述符是否仍会被删除?

时间:2011-09-04 02:06:29

标签: c unix posix system-calls

如果使用EIO关闭(2)系统调用失败,文件描述符是否仍会被删除?

如果是,通过稍后重试是否无法处理虚假IO错误?如果不是,应该如何防止文件描述符泄漏?

1 个答案:

答案 0 :(得分:12)

这是一个棘手的问题。但是,POSIX标准确实在close()

的描述中涵盖了它
  

如果close()被要捕​​获的信号中断,它将返回-1,并且errno设置为[EINTR]并且未指定fildes的状态。如果在close()期间读取或写入文件系统时发生I / O错误,则可能返回-1,并将errno设置为[EIO];如果返回此错误,则不指定fildes的状态。

因此,标准未指定文件描述符的状态。

出于大多数实际目的,它已经关闭;即使文件描述符正式打开,你也无法使用文件描述符。您可以尝试无害的操作(如fcntl()F_GETFL)并查看是否返回EBADF,表明描述符已正式关闭。但是如果它是开放的并且EIO错误的原因是永久性的,那么每次你尝试对它做任何事情时你都可能得到EIO(可能包括fcntl()调用)。您可能会或可能不会获得由另一个类似开放操作返回的相同描述符。目前尚不清楚,如果死文件描述符是打开但不可关闭的,即使dup2()可以成功指定'死'文件描述符作为目标。