2010-05-21 39 views
0

我有一個文件描述符是打開的,可能是非阻塞的讀取。我需要做的只是讀取所有數據,直到達到EOF並將該數據寫入可寫文件描述符。由於執行此複製的過程並不「意識到」周圍發生的任何事情,所以我不認爲我可以在等待數據時做一些有用的事情,並且我不想使用循環(while errno不是EAGAIN),因爲我認爲這將是浪費。在數據可用之前,是否有辦法阻止或以其他方式暫停執行復制過程?EAGAIN後強制阻止讀取?

回答

3

你對方的回答乾脆取消設置O_NONBLOCK,設定文件回堵。這很好,如果這在你的情況下有效;但如果沒有,您可以使用select()來阻止,直到您的非阻塞文件描述符可讀。

2

了Linux SCSI通用(sg)HOWTO的第7章給出瞭如何做到這一點an example

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