Принудительно блокировать чтение после EAGAIN? - PullRequest
0 голосов
/ 22 мая 2010

У меня есть файловый дескриптор, который открыт для чтения, который может быть неблокирующим. Что мне нужно сделать, это просто прочитать все данные до достижения EOF и записать эти данные в дескриптор файла для записи. Поскольку процесс, выполняющий это копирование, не «осведомлен» о том, что происходит вокруг, я не думаю, что могу сделать что-то полезное во время ожидания данных, и я не хочу использовать цикл while (хотя errno не EAGAIN), потому что я думаю, что это было бы расточительно. Есть ли способ заблокировать или иным образом приостановить выполнение процесса копирования, пока данные не станут доступными?

Ответы [ 2 ]

3 голосов
/ 23 мая 2010

Ваш другой ответ просто сбрасывает значение O_NONBLOCK, что возвращает файл к блокировке. Это прекрасно, если это работает в вашей ситуации; но если нет, вы можете использовать select() для блокировки до тех пор, пока ваш неблокирующий дескриптор файла не станет доступным для чтения.

2 голосов
/ 22 мая 2010

Глава 7 Linux SCSI Generic (sg) HOWTO дает пример того, как это сделать:

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