0

我有一个可以读取的文件描述符,它可能是非阻塞的。我需要做的是简单地读取所有数据,直到到达 EOF 并将该数据写入可写文件描述符。由于执行此复制的过程不“知道”周围发生的任何事情,我不认为我可以在等待数据时做一些有用的事情,而且我不想使用while循环(whileerrno是不是EAGAIN),因为我认为这会很浪费。有没有办法阻止或以其他方式暂停复制过程的执行,直到数据可用?

4

2 回答 2

4

您的其他答案只是 unsets O_NONBLOCK,它将文件设置回阻塞状态。如果这适用于您的情况,那很好;但如果没有,您可以使用select()阻塞直到您的非阻塞文件描述符可读。

于 2010-05-23T12:19:12.650 回答
2

Linux SCSI Generic (sg) HOWTO 的第 7 章给出了如何执行此操作的示例:

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
于 2010-05-22T14:39:56.133 回答