Как я могу узнать текущее состояние сигналов - PullRequest
2 голосов
/ 20 сентября 2010

Есть ли способ в C узнать следующую информацию о сигналах:

  1. Определенный сигнал заблокирован сейчас?
  2. Находимся ли мы внутри функции обработки сигналов chanin (т.е. был ли текущий код вызван из функции, которая была вызвана как обработчик сигнала для определенного сигнала)? Если да, могу ли я узнать, какой сейчас сигнал?

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 сентября 2010

Вы можете узнать, какие сигналы в настоящий момент заблокированы, вызвав sigprocmask со вторым аргументом null и третьим аргументом, отличным от NULL (первый аргумент игнорируется в этих условиях, поэтому передайте ноль). Он заполнит sigset_t, который вы указали в качестве третьего аргумента.

Я не знаю, как узнать, есть ли в стеке кадр обработчика сигнала. Я полагаю, вы могли бы как-то использовать семейство функций _Unwind_*, но это было бы ужасно.

0 голосов
/ 20 сентября 2010

Во-первых , вы можете использовать sigprocmask с указателем пустого набора .

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

а. как можно установить: SIG_UNBLOCK (сигнал в наборе удаляется из текущего набора заблокированных сигналов. Разрешается пытаться разблокировать сигнал, который не заблокирован)

б. set можно установить на NULL (поскольку вы не хотите изменять заблокированные сигналы)

с. Если oldset не равно NULL, предыдущее значение маски сигнала сохраняется в oldset. Ergo, вы получаете заблокированные сигналы в местоположении, адрес которого хранится в oldset.

Во-вторых , для того, чтобы знать, что вы находитесь в подпрограмме обработки сигнала, когда вы пишете определение обработчика сигнала, вы можете принять int signum в качестве параметра , например:

void mySignalHandler(int signum);

Если вы хотите знать, чтобы можно было блокировать некоторые другие сигналы в этот момент времени, вы можете просто иметь функцию блокировки в функции запуска и разблокировки в конце (используя sigprocmask()). Вы даже можете установить указанные сигналы в состояние SIG_IGN, чтобы игнорировать их при обработке текущего сигнала (используя signal()).

Наконец , пожалуйста прочитайте man страниц!

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

$ apropos "blocked signals"

дает вам около 5 ударов, 1 из которых sigprocmask

Ура!

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