Как правильно использовать единую функцию обработчика сигналов для нескольких сигналов? - PullRequest
9 голосов
/ 24 октября 2010

Как лучше всего в C на Linux настроить программу, которая может обрабатывать несколько сигналов POSIX с одной и той же функцией?

Например, в моем коде у меня есть функция-обработчик, которую я хочу вызывать в общем случае, когда появляется сигнал для выполнения некоторых действий:

/* Exit handler function called by sigaction */
void exitHandler( int sig, siginfo_t *siginfo, void *ignore )
{
  printf("*** Got %d signal from %d\n", siginfo->si_signo, siginfo->si_pid);
  loopCounter=0;

  return;
}

Я настроил два сигнала для перехвата с помощью индивидуальных вызовов sigaction для каждого сигнала:

/* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = exitHandler;
sigaction( SIGUSR1, &act, 0 );
sigaction( SIGINT, &act, 0 );

Это правильный способ настроить этот тип обработки? Есть ли другой способ, где мне не нужно перечислять все возможные номера сигналов?

Ответы [ 3 ]

4 голосов
/ 24 октября 2010

Параметр "signum" системного вызова "sigaction" является целочисленным значением, которое не работает как флаг.

Насколько я знаю, невозможно назначить одну функцию-обработчик для нескольких сигналов за один вызов.

3 голосов
/ 24 октября 2010

Я не вижу, как можно просто установить один обработчик для всех сигналов.Однако вы можете получить довольно близко, используя sigfillset(), чтобы сгенерировать набор, содержащий все действительные номера сигналов, а затем перебрать возможные номера сигналов, используя sigismember() определить, есть ли этот номер в наборе, и установить обработчик, если так.Хорошо, я не вижу метода определения максимально возможного числа сигналов, поэтому вам, возможно, придется угадать подходящее максимальное значение.

1 голос
/ 25 июня 2017

Это правильный способ настроить этот тип обработки?

Не совсем - использование обработчика сигнала printf() небезопасно , но вы все равно можете использовать write() до stdout или stderr.

...