В C++ на Linux, насколько я понимаю, если один и тот же сигнал передается несколько раз, возможно, обработчик сигнала будет вызываться только один раз. Можно ли переопределить это поведение? Скажем, например, что у меня есть несколько файловых дескрипторов, и я хочу получать уведомления от SIGIO всякий раз, когда в этих файловых дескрипторах есть события. Поэтому я звоню fcntl
с командой F_SETOWN_EX
на каждый из них. Но если есть одновременные события в 2 дескрипторах файлов, я могу получить только один SIGIO, а затем никогда не знаю, что событие произошло в другом файловом дескрипторе.Возможно ли предотвратить конденсацию сигнала?
Теперь я знаю, что вы можете удивиться, почему я хочу использовать сигналы вообще, а не jusgt epoll
или что-то в этом роде. Дело в том, что меня интересует точное время, когда происходят события, поэтому я думал позвонить clock_gettime
из обработчика сигнала SIGIO для записи точного времени события.
В Linux вы можете использовать 'sigaction' для настройки обработчика сигнала, чтобы * блокировать * сигнал во время работы обработчика; сигнал доставляется в поток, который не блокирует его, или первый поток, который блокирует его. –
@Kerrek: Итак, вы говорите, что если один и тот же сигнал отправляется дважды моему процессу, и у меня есть 2 потока, которые не блокируют его, я получаю сигнал дважды, возможно, в разных потоках? –
Нет, я этого не говорил или хотел сказать. Среди вещей, которые я хотел сказать, заключается в том, что если ваш обработчик сигналов установлен с 'sigaction' и соответствующей' sa_mask', тогда для каждого переданного сигнала должен вызываться один обработчик сигнала. –