URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8417
[ Назад ]

Исходное сообщение
"read() после select()"

Отправлено John Lepikhin , 01-Сен-09 13:12 
Кусочек вывода strace:

select(1045, [16 1044], [1040], [], {0, 148319}) = 2 (in [16 1044], left {0, 148319})
read(16, 0xbf85241c, 4096)              = -1 EAGAIN (Resource temporarily unavailable)

select говорит, что на двух сокетах (16 и 1044) есть готовые данные для чтения. Сразу же после этого, из 16-го сокета пытаемся читать и получаем отказ, что данных нет. Как такое может быть?


Содержание

Сообщения в этом обсуждении
"read() после select()"
Отправлено Vlad Lazarenko , 01-Сен-09 16:31 
>Кусочек вывода strace:
>
>select(1045, [16 1044], [1040], [], {0, 148319}) = 2 (in [16 1044],
>left {0, 148319})
>read(16, 0xbf85241c, 4096)          
>    = -1 EAGAIN (Resource temporarily unavailable)
>
>select говорит, что на двух сокетах (16 и 1044) есть готовые данные
>для чтения. Сразу же после этого, из 16-го сокета пытаемся читать
>и получаем отказ, что данных нет. Как такое может быть?

А Вы FD_ISSET проверьте, чтобы наверняка.


"read() после select()"
Отправлено svn , 02-Сен-09 12:46 
>select говорит, что на двух сокетах (16 и 1044) есть готовые данные
>для чтения.

select говорит что операция чтения/записи не будет заблокирована! А вовсе не то что данные будут прочитаны или записаны.

В твоём случае, похоже на конец файла/закрытия сокета. То есть, select тебе предлагает прочитать, чтобы узнать что это конец.