是否正在检查文件或文件夹是否被阻止或未被阻止?
access( fname, F_OK ) // blocking ?
打开目录/文件是否被阻止?
opendir(dir); // blocking?
open(fd..); // blocking?
列表目录是否被阻止?
readdir // blocking?
按封锁,我的意思是要花很长时间才能返回。
答案 0 :(得分:4)
(我假设您的意思是“块”,因为它通常在Unix手册页和相关文档中使用:也就是说,您是在问这些操作是否可能涉及等待较长时间的I / O的调用过程,以便完成。如果这不是您的意思,请编辑您的问题以澄清。)
简短的回答是,所有这些系统调用都可能会阻塞。
长答案:
检查文件或文件夹是否存在:从不执行,它将TOCTOU竞争条件引入程序。在Unix系统编程的20年中,我几乎从未遇到过access
系统调用是正确使用的情况。而是继续尝试打开文件,进入目录,然后检查是否失败。
已经说过,access
,stat
和lstat
可以出于open
可以(出于以下讨论)的相同原因进行阻止。 fstat
不能保证不被阻止,但通常可以假定不会。
open
和opendir
可以阻止,即使您使用O_NONBLOCK
。发生这种情况的最常见情况是,当您尝试打开的文件或目录位于远程文件系统上时,要找出文件是否存在并被允许访问,就需要通过网络发送数据包。>
POSIX API中没有解决此问题的方法,因为无法表示正在进行的open
操作。联网API将套接字(socket
,不能阻止)的创建与将其连接到远程对等端(connect
,可以)的请求分开,因此当connect
返回-1,errno设置为EINPROGRESS
,您已经知道套接字描述符号,可以在其上select
。如果open
给您EINPROGRESS
,您将没有select
的文件描述符。
readdir
可以出于所有相同的原因阻止普通的旧read
可以阻止。再次提醒您,最常见的情况是该目录位于远程文件系统上。这种情况下的问题是DIR
抽象妨碍了以正常方式请求非阻塞I / O。