Принудительно блокировать чтение после 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));