Декларация подписи в функциях - PullRequest
0 голосов
/ 11 апреля 2019

Является ли sigaction в Unix объявленным только один раз в функции main, или я должен объявить ее внутри каждой функции, которую вызывает мой main, поэтому, если поступает сигнал, когда выполнение не находится внутри моего main, обработчик сигнала будетссылаться?Итак, я должен объявлять sigaction только один раз в начале main() или я должен объявлять его в каждой функции?

1 Ответ

1 голос
/ 11 апреля 2019

Вам не нужно вызывать sigaction() в каждой функции.Он устанавливает (глобальный) обработчик сигнала для данного сигнала, который остается обработчиком сигнала до тех пор, пока вы не измените его - другим вызовом sigaction() для того же сигнала.Вы можете позвонить sigaction() в main(), но это также не обязательно.Вы можете вызывать его в других выбранных функциях.

Обратите внимание, что вам нужно вызывать sigaction() один раз для каждого отдельного сигнала, который вы хотите обработать - или игнорировать.Часто полезно вызывать функцию, которая перебирает список сигналов, устанавливая соответствующий обработчик (и) для каждого сигнала.Слава Богу, вам не нужно делать это в каждой вызываемой функции!

В общем, избегайте смешивания вызовов для signal() и sigaction() в одной и той же программе.Если вы используете sigaction() где-либо, используйте его везде.Однако, если вы настаиваете на том, чтобы быть извращенным, тогда вы можете использовать «sigaction() или signal()» в первом абзаце, где я упомянул только sigaction().

Обратите внимание, что вы можете использовать sigaction(), чтобы найтикак обрабатывается сигнал без установки новой обработки сигнала.С помощью signal() вы можете узнать (более или менее), как обрабатывается сигнал, но вы также должны установить действие.Еще одна причина предпочесть sigaction() над signal().

Обратите внимание, что я предполагаю, что слово «объявить» в вопросе означает «звонок» в той или иной форме.Вы не объявляете sigaction() ни в одной функции;Вы включаете <signal.h>, чтобы объявить это.

...