LINUX.ORG.RU

Как организовать завершение работы сервера?


0

0

Написал простой сервер на C. Принцип работы - главный поток ждёт (функция accept()) пока к нему присоединится клиент, как только это происходит - создаёт поток который работает с клиентом, и опять ждёт нового клиента и т.д.

Требуется, чтобы при получении сигнала (например SIGINT), главный поток переставал ждать присоединения.

Кто представляет - как такое можно сделать?

Единственное, что я смог придумать, это
1. Заставить обработчик сигнала изменять переменную-флаг.
2. Сделать слушающий сокет не блокируемым, с помощью select() ждать несколько секунд присоединения, затем проверять значение флага и опять ждать и т.д.
Но это, как говорится, не труЪ. Хотелось бы, чтобы можно было "влиять" на select() также как это делают файловые дискрипторы :). Но возможно ли такое?

По умолчанию SIGINT прерывает системные вызовы, такие как accept. Возвратится -1 и errno установится в EINTR.

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

> А pselect починили? В 2.4 он был "официально" кривой...

а разве кто-то ещё помнит, что был 2.4?

// wbr

klalafuda ★☆☆
()

Всем спасибо за помошь.

LinuxUser ★★★
() автор топика

можно создать дополнительный файловый дескриптор для этих задач. select будет ждать и сокетный дескриптор и дополнительный. когда надо остановить сервер - в дополнительный дескриптор засылается "событие".

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