‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Зомби-сокет.

Ситуаций чуточку улучшился.

Чтобы было понятнее, условия задачи такие: сокет-"сервер" ждят новые соединения и, получив их. запускает отдельный поток для каждого нового клиентского подключения.

Сейчас даже заработало определение разрыва соединения, которых не было ни единого, при помощи poll() - половина проблемы решена.
Но поведение серверного сокета стало изощрённее: раньше он всегда превращался в зомби, если прибить процесс. На сигнал SIGTERM я повесил обработчик, принудительно закрывающий и серверный сокет, и все клиентские. Теперь, перед тем как закрыт серверный сокет, ему устанавливаются такие опции:
	setsockopt (socket_id, IPPROTO_TCP, TCP_NODELAY, &(int){ 1 }, sizeof(int));
	setsockopt (socket_id, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int));

Первая отключает какой-то там алгоритм и зануляет таймаут TIME_WAIT (или нет?), вторая опция говорит системе, что этот сокет можно использовать повторно.

Так вот, если я запускаю серверный процесс и пришибаю его, когда он ещё ни разу не завершил accept(), тогда всё нормально. А если какой-то клиент уже подключался (и не важно, разорвал своеё соединение или нет), то тут 50/50: или серверный сокет станет зомби, или не станет.

Может, есть какой-нибудь непортабельный вызов на уровне ядра, чтоб надёжно пристрелить сокет? Эта хреня реально бесит и мешает отлаживаться.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments