MAS> Я принял accept, создался новый сокет и теперь
MAS> я жду пока мне что-то пришлют. Делаю
MAS> как обычно, при помощи select. Hо на том конце
MAS> взяли и закрыли соединение, так ничего и не послав.
MAS> 1) как я могу об этом узнать?
MAS> 2) что вернет select в этом случае?
MAS> 3) есть ли переносимый способ получить такой сигнал?
См. Unix Programming FAQ и Unix Socket FAQ (ищи на Altavista).
Вкратце:
select() вылетит и скажет, что из этого сокета можно читать,
а read() вернет 0 - признак EOF.
SY, Yar
--- ifmail v.2.14dev3
* Origin: Chem. Dept. of Moscow State University (2:5020/118)
> Пришлось мне писать программку-демон для юникса с использованием tcp/ip.
> Входящие данные должны обрабатываться в порядке очереди, поэтому все
> просто - для каждого сокета заводим fd, помещаем их в список и запускаем
> select. Все отлично работает, за исключением одного: когда
> подсоединившийся клиент вылетает аварийно (ну например подвисла у него
> маздайка), select начинает вести совершнно ненормально. Иногда начинает
> возвращать какую-то ересь, а чаще всего программа целиком вылетает с
> сообщением broken pipe, что не есть хорошо для демона.
Hу, лови SIGPIPE и ставь флаг, что какое-то соединение поpвалось.
> В доках по select'у я ничего не нашел про аварийный разрыв соединения.
> Так вот, как узнать, разорвано ли соединение, соответветствующее данному
> fd? И можно ли это сделать вообще?
write()/send() тебе выдаст ECONNRESET или аналог. Если SIGPIPE словишь (или
пpоигноpиpуешь).