LINUX.ORG.RU

O_NONBLOCK и Resource temporary unavailable


0

0

Такая ситуация: необходимо заставить главный процесс читать информацию из каналов (pipe()) открытых с дочерними процессами в неблокирующем режиме.

Возникают проблемы в таком случае: дочерний пишет информ. - все нормально, родитель читает; потом задержка на пару секунд - родитель говорит что информации нет (судя по errno - Resource temporary unavailable); потом подача информ. возобновляется - но родитель продолжает выдавать Resource temporary unavailable.

Делаю так: создаю pipe, дескриптор для чтения перевожу в неблокирующий режим:

fcntl(f_filedes[0], F_SETFL, O_NONBLOCK);

размножаю процесс ( fork() ), в каждом из процессов закрываю дескрипторы для чтения и записи (соотвецтвенно в дочернем и родительском). Потом дочерний пишет инфу, а родительский читает. В принципе для 2-х процессов неблок. режим и не нужен. Но если процессов больше, то главный должен обслуживать всех, а не ждать информации от первого, потом от второго, и т.д. , так как программа предполагается интерактивная. Короче: на главный процесс вешается функция сбора информации.

kernel 2.6.6, gcc 3.2.2


Ты либо что-то путаешь либо где-то глючишь. Resource temporary unavailable выскакивает когда нечего читать, как только появляются данные они прочитываются.

anonymous
()
Ответ на: комментарий от x86

А в чем собственно разница между pipe и socketpair? все равно читать надо через read в неблокирующем режиме, но я попробую.

А на счет путаю - не знаю, все вроде верно. Один пишет другой читает... Но после прекращения подачи данных и последующего возобновления читающий процесс пишет Resource temporary unavailable.

P.S. "Resource temporary unavailable" выдает cout << strerror(errno);

zhuk
() автор топика
Ответ на: комментарий от zhuk

Извиняюсь...

Написал тестовую программку - работает нормально. При возобновлении подачи данных чтение идет нормально. Если нет данных то возвращ. "Resource..." и read() возвращает -1, а если закрыт дескриптор для записи, то тоже "Resource..." через errno и 0 через read(). Теперь осталось искать ошибки в программе...

zhuk
() автор топика
Ответ на: комментарий от zhuk

во-во сразу тест и надо было делать

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.