2010-05-21 2 views
0

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

ответ

3

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

2

Глава 7 Linux SCSI Generic (SG) МЕТОДИЧЕСКИЕ дает an example о том, как это сделать:

int flags = fcntl(fd, F_GETFL); 
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK)); 
Смежные вопросы