Могу ли я проверить наличие ожидающих сигналов и выполнить их немедленно - PullRequest
1 голос
/ 07 сентября 2011

Я хочу обрабатывать сигналы только в некоторых известных точках моего кода.Поэтому в этих точках я проверю ожидающий сигнал и немедленно выполню его обработчик.

Я знаю, что могу использовать sigprocmask, чтобы заблокировать сигнал, а затем разблокировать его, но, тем не менее, сигнал будет доставлен в любой момент времени после разблокировки, что мне не нужно.Я хочу выполнить обработчик сигнала точно в определенном месте в моем коде.Другими словами, я хочу сделать синхронизацию обработки сигналов.

Есть ли какой-нибудь способ добиться того, что я пытаюсь сделать?

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

Вы можете получить любой ожидающий заблокированный сигнал, используя семейство системных вызовов sigwait. Невозможно одновременно ожидать и сигналы, и другие типы событий, хотя, если вы не хотите блокировать в sigwait, вы можете сначала проверить наличие ожидающих сигналов, используя sigpending.

Если вы используете управляемый событиями дизайн для своего приложения, у вас обычно будет несколько fds в цикле выполнения. Для этой ситуации вы должны вместо этого использовать обработчик сигнала, который записывает в pipe. Сигнал будет доставлен асинхронно, но затем появится в вашем цикле выполнения как еще один fd, который нуждается в обработке.

1 голос
/ 07 сентября 2011

Если я вас правильно понимаю, вы можете просто использовать sigwait, чтобы очистить каждый из ожидающих сигналов, а затем напрямую вызвать функцию обработки вашего сигнала.

В тех точках вашего кода, где вы хотите обрабатывать и очищать ожидающие сигналы, вы можете использовать sigpending для проверки наличия ожидающих сигналов, а затем повторно вызывать sigwait для очистки ожидающих сигналов, вручную вызывая функцию обработки сигналов выполнить требуемое действие.

0 голосов
/ 07 сентября 2011

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

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