是否检查文件或文件夹是否存在阻止或非阻止?

时间:2019-06-01 01:06:13

标签: c linux

是否正在检查文件或文件夹是否被阻止或未被阻止?

access( fname, F_OK ) // blocking ?

打开目录/文件是否被阻止?

opendir(dir); // blocking?
open(fd..); // blocking?

列表目录是否被阻止?

readdir // blocking?

按封锁,我的意思是要花很长时间才能返回。

1 个答案:

答案 0 :(得分:4)

(我假设您的意思是“块”,因为它通常在Unix手册页和相关文档中使用:也就是说,您是在问这些操作是否可能涉及等待较长时间的I / O的调用过程,以便完成。如果这不是您的意思,请编辑您的问题以澄清。)

简短的回答是,所有这些系统调用都可能会阻塞。

长答案:

  • 检查文件或文件夹是否存在:从不执行,它将TOCTOU竞争条件引入程序。在Unix系统编程的20年中,我几乎从未遇到过access系统调用是正确使用的情况。而是继续尝试打开文件,进入目录,然后检查是否失败。

    已经说过,accessstatlstat可以出于open可以(出于以下讨论)的相同原因进行阻止。 fstat不能保证不被阻止,但通常可以假定不会。

  • openopendir可以阻止,即使您使用O_NONBLOCK 。发生这种情况的最常见情况是,当您尝试打开的文件或目录位于远程文件系统上时,要找出文件是否存在并被允许访问,就需要通过网络发送数据包。

    POSIX API中没有解决此问题的方法,因为无法表示正在进行的open操作。联网API将套接字(socket,不能阻止)的创建与将其连接到远程对等端(connect,可以)的请求分开,因此当connect返回-1,errno设置为EINPROGRESS,您已经知道套接字描述符号,可以在其上select。如果open给您EINPROGRESS,您将没有select的文件描述符。

  • readdir可以出于所有相同的原因阻止普通的旧read可以阻止。再次提醒您,最常见的情况是该目录位于远程文件系统上。这种情况下的问题是DIR抽象妨碍了以正常方式请求非阻塞I / O。