Сигнал маскировки при обновлении глобальных переменных - PullRequest
0 голосов
/ 02 октября 2011

Мне известно, что я могу замаскировать сигнал, возникающий при выполнении обработчика (используя sa_mask).Тем не менее, я хотел бы знать, как замаскировать сигнал при обновлении некоторых глобальных переменных.

Кроме того, я хотел бы знать, как замаскировать сигнал при выполнении определенной пользователем определенной функции.

Можно ли сделать эти 2 вещи?

Буду признателен за любую помощь

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 октября 2011

Возможно заблокировать сигналы с помощью sigblock().Блокированные сигналы будут поставлены в очередь и выпущены, когда сигнал разблокирован.

ОДНАКО - это супер дорого.Вы должны сделать системный вызов, чтобы заблокировать и системный вызов, чтобы разблокировать.Это может быть довольно медленным, если вы делаете это часто.Так что есть несколько альтернативных подходов:

  1. Если вы используете Linux, используйте signalfd .Вы можете заблокировать все сигналы один раз и перенаправить их в дескриптор файла, а затем обрабатывать их всякий раз, когда это безопасно.
  2. В противном случае (или если обработка асинхронных сигналов важна), вы можете отложитьсигналы в пространстве пользователя.Перед входом в критический раздел установите флаг volatile.В вашем обработчике сигналов проверьте этот флаг;если вы видите, write() на pipe номер сигнала и сразу же возвращайтесь.В вашем обработчике сигналов проверьте наличие сигнала на этом канале и повторно raise сигнал в этой точке.
0 голосов
/ 02 октября 2011

Вы можете вызывать «signal ()» в любое время;либо a) установить обработчик сигнала в некоторый пользовательский код, либо b) очистить его, установив аргумент обработчика в NULL.

sigaction () , конечно, дает вам еще болеедетальный контроль.Вы также можете вызывать sigaction в любое время (например, перед обновлением глобальных переменных).

Эта ссылка может помочь:

http://www.linuxjournal.com/article/6483

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