Использование sigaction () - PullRequest
       1

Использование sigaction ()

6 голосов
/ 20 декабря 2011

Мне нужно отправить два сигнала процессу, SIGUSR1 и SIGUSR2, чтобы изменить конкретную логическую переменную в программе (SIGUSR1 устанавливает для нее true , SIGUSR2 устанавливает значение false ). Поэтому я написал signalHandler() функцию для управления поведением SIGUSR1 или SIGUSR2. Проблема заключается в следующем: как настроить sigaction() для выполнения этой конкретной задачи? Я провел много времени в Google, я везде читал, что я должен использовать sigaction() вместо устаревшего signal(). На странице справки я нашел это

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

в signum я должен указать тип сигнала, который я хочу обработать, тогда у меня есть параметр struct sigaction:

  struct sigaction {
       void     (*sa_handler)(int);
       void     (*sa_sigaction)(int, siginfo_t *, void *);
       sigset_t   sa_mask;
       int        sa_flags;
       void     (*sa_restorer)(void);
   };

в первом поле я подумал, что должен установить имя моего обработчика сигналов, но я не знаю, как я могу установить другие поля.

Наконец, какая польза от: struct sigaction *oldact?

1 Ответ

7 голосов
/ 20 декабря 2011

См. Справочную страницу (2) .Там все описано.

В основном вы устанавливаете sa_handler или sa_sigaction в зависимости от того, хотите ли вы дополнительную информацию о сигнале.

Если вы установите более позднюю, вам нужно добавить SA_SIGINFO на флаги.В противном случае флаги, вероятно, должны быть 0 для вашего случая.Возможно, вы хотите, чтобы системные вызовы не выполнялись с ошибкой EINTR при прерывании с сигналом (поведение по умолчанию), поэтому вы можете рассмотреть новое значение переменной до их перезапуска, но если вы в итоге захотели перезапустить их автоматически (selectи poll никогда не перезапускаются), вы можете установить флаг SA_RESTART.

sa_mask - это набор сигналов, которые должны обрабатываться во время работы этого обработчика сингла.Вы должны установить по крайней мере два сигнала, чтобы они не перепутались, если они приходят в быстрой последовательности.

И последнее, sa_restorer устарело и не используется в любом случае.

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