есть SIGINT
обработчик. Он устанавливает переменную для всей программы: errflag
. Когда я делаю select()
и он прерван через SIGINT
, я проверяю errflag
, чтобы узнать, есть ли он SIGINT
(имеют собственную константу, назначенную errflag
). Однако обработчик может опоздать и errflag
еще не установлен. Как отложить обработку до разрешения обработчика на errflag
? Или как это реализовать правильно?Как обеспечить завершение обработки обработчика сигнала и только затем продолжить программу?
Кроме того, в одном пути кода select()
возвращает -1
на Ctrl-C, errno
является EINTR
. Здесь обработчик никогда не опаздывает. На другом пути select()
возвращает -1
, errno
также EINTR
, но обработчик выводит сообщение журнала немного позже и опаздывает, мои проверки errflag
уже выполнены.
Как указано в первом ответе, прерывание останавливает текущую обработку и запускает обработчик, и, если обработчик возвращает, либо перезапускает системный вызов, либо прерывает его с помощью 'errno', установленного в' EINTR'. Используете ли вы 'signal()' или 'sigaction()'? Без вашего кода будет трудно понять, что происходит не так, но ваша интерпретация, что обработчик сигнала может быть отложен, в основном неправильна. С помощью 'sigaction()' вы можете заблокировать один сигнал, в то время как другой сигнал обрабатывается 'sa_mask', но заблокированный сигнал будет доставлен при возврате первого обработчика. –
@JonathanLeffler: да, вы правы, сигнал вручную откладывается механизмом очереди, а обработчик рано возвращается, не отлаживал печать до этого и интерпретировал вызов из очереди как первый, поздний вызов. – Itzie
Итак, у вас был обработчик сигналов с двумя или более маршрутами выхода, и у одного был диагностический отпечаток, а другой нет? Легко сделано - но и что-то, на что можно смотреть. Это может привести к серьезной неправильной интерпретации результатов. Одним из (немногих) достоинств программирования с одиночной записью и одним выходом является то, что вы не сталкиваетесь с этой проблемой! –