Принудительно блокировать чтение после EAGAIN?

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

2 ответа

Решение

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

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

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
Другие вопросы по тегам