Вчера сел проверять CCD_Capture на FLI'шном оборудовании и обнаружил странный косяк: в казалось бы произвольный момент времени при отправке клиенту данных сервер просто падал. Без сегфолтов, без ничего: тихо-мирно. Сначала решил, что это — баг fli'шной библиотеки при одновременной работе с разным железом, натыкал еще мьютексов. Фигвам: не помогло.
Сейчас уже в функции отправки сообщений воткнул
и обнаружил, что после отключения клиента еще одно-два сообщения благополучно отправляются (т.е. write, несмотря на отключенный сокет, возвращает длину сообщения, а не -1), а потом оно падает…
Ну и веселуха, блин! На моем рабочем компьютере это никак не проявлялось. Буду думать, какой же велосипед воткнуть!!!
UPD: дурень я, дурень! write в отключенный сокет генерирует SIGPIPE. И этот сигнал убивает мастера! Странно, что я не натыкался на это раньше. В общем, вместо write нужно использовать send с флагом MSG_NOSIGNAL или же глобально отключать реакцию на SIGPIPE!!!
// нужно пересмотреть все свои серверные утилиты и везде сделать такую замену. Похоже, при отключении клиента во время записи ему сигналов поток стабильно отваливался, но т.к. тут же "страж" поднимал новый, я этого не замечал, а в логах на этот предмет не думал даже ковыряться.
Сейчас уже в функции отправки сообщений воткнул
DBG("write %d = %zd", l, write(fd, tmpbuf, l));и обнаружил, что после отключения клиента еще одно-два сообщения благополучно отправляются (т.е. write, несмотря на отключенный сокет, возвращает длину сообщения, а не -1), а потом оно падает…
Ну и веселуха, блин! На моем рабочем компьютере это никак не проявлялось. Буду думать, какой же велосипед воткнуть!!!
UPD: дурень я, дурень! write в отключенный сокет генерирует SIGPIPE. И этот сигнал убивает мастера! Странно, что я не натыкался на это раньше. В общем, вместо write нужно использовать send с флагом MSG_NOSIGNAL или же глобально отключать реакцию на SIGPIPE!!!
// нужно пересмотреть все свои серверные утилиты и везде сделать такую замену. Похоже, при отключении клиента во время записи ему сигналов поток стабильно отваливался, но т.к. тут же "страж" поднимал новый, я этого не замечал, а в логах на этот предмет не думал даже ковыряться.