gpt4 book ai didi

c - 检查文件或文件夹是否存在阻塞或非阻塞?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:38 24 4
gpt4 key购买 nike

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

access( fname, F_OK ) // blocking ?

打开目录/文件是阻塞还是非阻塞?

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

list dir 是阻塞还是非阻塞?

readdir // blocking?

所谓阻塞,是指需要很长时间才能返回。

最佳答案

(我假设您指的是“ block ”,它通常用于 Unix 联机帮助页和相关文档:也就是说,您是在询问这些操作是否涉及调用进程等待 I/O 的延长时间完整。如果这不是你的意思,请编辑你的问题以澄清。)

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

长答案:

  • 检查文件或文件夹是否存在:永远不要这样做,它会引入一个 TOCTOU竞争条件进入你的程序。在 20 年的 Unix 系统编程中,我几乎从未遇到过 access 系统调用是正确使用的情况。相反,直接尝试打开文件、输入目录等等,然后检查是否失败。

    话虽如此,accessstatlstat 可以阻塞的原因与 open 可以(下面讨论)。 fstat保证不阻塞,但通常可以假设它不会。

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

    在 POSIX API 中没有任何办法解决这个问题,因为没有办法表示正在进行的 open 操作。网络 API 将套接字(socket,无法阻止)的创建与将其连接到远程对等点的请求(connect,可以)分开,因此当 connect 返回 −1 且 errno 设置为 EINPROGRESS 时,您已经知道套接字描述符编号并且可以对其进行选择。如果 open 给你EINPROGRESS,你就没有文件描述符可以select了。

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

关于c - 检查文件或文件夹是否存在阻塞或非阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com