2015-05-23 5 views
2

В C++ на Linux, насколько я понимаю, если один и тот же сигнал передается несколько раз, возможно, обработчик сигнала будет вызываться только один раз. Можно ли переопределить это поведение? Скажем, например, что у меня есть несколько файловых дескрипторов, и я хочу получать уведомления от SIGIO всякий раз, когда в этих файловых дескрипторах есть события. Поэтому я звоню fcntl с командой F_SETOWN_EX на каждый из них. Но если есть одновременные события в 2 дескрипторах файлов, я могу получить только один SIGIO, а затем никогда не знаю, что событие произошло в другом файловом дескрипторе.Возможно ли предотвратить конденсацию сигнала?

Теперь я знаю, что вы можете удивиться, почему я хочу использовать сигналы вообще, а не jusgt epoll или что-то в этом роде. Дело в том, что меня интересует точное время, когда происходят события, поэтому я думал позвонить clock_gettime из обработчика сигнала SIGIO для записи точного времени события.

+0

В Linux вы можете использовать 'sigaction' для настройки обработчика сигнала, чтобы * блокировать * сигнал во время работы обработчика; сигнал доставляется в поток, который не блокирует его, или первый поток, который блокирует его. –

+0

@Kerrek: Итак, вы говорите, что если один и тот же сигнал отправляется дважды моему процессу, и у меня есть 2 потока, которые не блокируют его, я получаю сигнал дважды, возможно, в разных потоках? –

+0

Нет, я этого не говорил или хотел сказать. Среди вещей, которые я хотел сказать, заключается в том, что если ваш обработчик сигналов установлен с 'sigaction' и соответствующей' sa_mask', тогда для каждого переданного сигнала должен вызываться один обработчик сигнала. –

ответ

0

Старый вопрос, но в случае, если кто-то еще удивляется: вы должны быть в состоянии сделать то, что вы хотите с помощью fcntl с F_SETSIG выбрать в реальное время сигнала (номер сигнала> = SIGRTMIN), вместо того, чтобы использовать по умолчанию SIGIO ,

Смежные вопросы