在EAGAIN之后强制阻止读取?

时间:2010-05-21 23:18:52

标签: c nonblocking file-descriptor posix-api

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

2 个答案:

答案 0 :(得分:3)

您的其他答案只需取消设置O_NONBLOCK,即将文件设置为阻止。如果在你的情况下有效,那就完全没问题;但如果没有,您可以使用select()来阻止,直到您的非阻塞文件描述符可读。

答案 1 :(得分:2)

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

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