代码之家  ›  专栏  ›  技术社区  ›  Daniel Trebbien

在eagain之后强制阻止读取?

  •  0
  • Daniel Trebbien  · 技术社区  · 14 年前

    我有一个可供阅读的文件描述符,它可能是非阻塞的。我需要做的只是读取所有数据,直到到达EOF,然后将数据写入可写的文件描述符。由于执行此复制的过程没有“意识到”它周围发生的任何事情,因此我认为在等待数据时我不能做一些有用的事情,而且我不想使用 while 循环(同时) errno 不是 EAGAIN )因为我认为这是浪费。是否有方法阻止或暂停复制过程的执行,直到数据可用?

    2 回复  |  直到 14 年前
        1
  •  3
  •   caf    14 年前

    你的另一个回答只是令人不安 O_NONBLOCK ,将文件设置回阻塞状态。如果这在你的情况下有效,那就太好了;但是如果不行,你可以使用 select() 在非阻塞文件描述符可读之前阻塞。

        2
  •  2
  •   Daniel Trebbien    14 年前

    Linux SCSI通用(SG)的第7章如何给出 an example 如何做到这一点:

    int flags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));