sigaction - почему бы нам не сбросить обработчик? - PullRequest
2 голосов
/ 13 марта 2011

Если мы используем sigaction для определения обработчика сигнала, то почему нам не нужно переустанавливать обработчик?Если мы используем signal(sig_no,handler_func), то мы должны сбросить его.Почему это?

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void func(int sig)
{
 printf("caught signal:%d\n",sig);
 // Not needed to reset handler. Why? 
}

int main()
{
 struct sigaction sa;

 sa.sa_handler=(void*)func;
 sigaction(SIGRTMIN,&sa,NULL);
 kill(0,SIGRTMIN);
 kill(0,SIGRTMIN);
 kill(0,SIGRTMIN);
}
Output:
[root@dhcppc0 signals]# ./a.out
     caught signal:34
     caught signal:34
     caught signal:34 (3 times signal caught by same handler without resetting handler)

Ответы [ 2 ]

6 голосов
/ 13 марта 2011

Настоящая причина восходит к несколько десятилетий назад. Оригинальный signal() не перевооружил обработчик. Это также не перезапускало прерванные системные вызовы. Ребята из BSD решили иметь более «надежный» signal(), поэтому они изменили эту семантику.

Поскольку поведение System V и BSD было таким разным, комитет POSIX решил ввести новый системный вызов sigaction() с параметрами для изменения его поведения. Таким образом, вся причина существования sigaction() заключается в том, чтобы иметь сигнал, использующий код, который ведет себя одинаково во всех вариантах Unix.

(Обратите внимание, что поведение signal() может изменить даже при использовании того же libc, например, glibc использует поведение BSD по умолчанию и поведение SYSV, когда определено _XOPEN_SOURCE).

5 голосов
/ 13 марта 2011

Если вы не укажете SA_RESETHAND в флагах, расположение не изменится (и, следовательно, не нуждается в сбросе)

Если бы вы установили sa.sa_flags = SA_RESETHAND Вам нужно будет сбросить его, потому что расположение будет сброшено на SIG_DFL (что и происходит с signal())

По сути, ответ на ваш вопрос: «Потому что так работает sigaction. Его поведение отличается от сигнала».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...