LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Используй не signal() а sigaction(). А за поведение, на которое ты жалуешься, там отвечает флаг SA_RESTART. Если его не ставить - accept висеть не будет, и вернёт EINTR после первого же сигнала. Хотя я подозреваю что и у signal() будет такое же поведение, но не проверял, возможно он и правда работает как будто SA_RESTART установлен.

if(num == SIGTERM) {

Эта проверка тут лишняя. Если тебе нужно разное поведение на разных сигналах - просто назначь им разные обработчики.

В обработчике сигнала обычно записывают единицу в какую-нить volatile переменную и больше ничего не делают. А наличие этой единицы проверяет уже основной код программы там где надо. Например у тебя можно сделать volatile int exit_flag; и вместо while(1) сделать while(!exit_flag)

Исправление firkax, :

Используй не signal() а sigaction(). А за поведение, на которое ты жалуешься, там отвечает флаг SA_RESTART. Если его не ставить - accept висеть не будет, и вернёт EINTR после первого же сигнала. Хотя я подозреваю что и у signal() будет такое же поведение, но не проверял, возможно он и правда работает как будто SA_RESTART установлен.

if(num == SIGTERM) {

Эта проверка тут лишняя. Если тебе нужно разное поведение на разных сигналах - просто назначь им разные обработчики.

В обработчике сигнала обычно записывают единицу в какую-нить volatile переменную и больше ничего не делают. А наличие этой единицы проверяет уже основной код программы там где надо.

Исправление firkax, :

Используй не signal() а sigaction(). А за поведение, на которое ты жалуешься, там отвечает флаг SA_RESTART. Если его не ставить - accept висеть не будет, и вернёт EINTR после первого же сигнала. Хотя я подозреваю что и у signal() будет такое же поведение, но не проверял, возможно он и правда работает как будто SA_RESTART установлен.

if(num == SIGTERM) {

Эта проверка тут лишняя. Если тебе нужно разное поведение на разных сигналах - просто назначь им разные обработчики.

Исходная версия firkax, :

Используй не signal() а sigaction(). А за поведение, на которое ты жалуешься, там отвечает флаг SA_RESTART. Если его не ставить - accept висеть не будет, и вернёт EINTR после первого же сигнала. Хотя я подозреваю что и у signal() будет такое же поведение, но не проверял, возможно он и правда работает как будто SA_RESTART установлен.