что, если определенный сигнал не заблокирован, будут ли помещены в очередь несколько экземпляров одного и того же сигнала?
Это зависит от того, был ли установлен флаг SA_SIGINFO для сигнала с использованием sigaction
структура и sigaction()
функция, и есть ли в вашей системе правильное определение _POSIX_REALTIME_SIGNALS (современные ядра Linux делают).Если оба экземпляра истинны, то любые поступающие сигналы, которые соответствуют этим двум условиям, будут поставлены в очередь в очереди для каждого процесса до тех пор, пока они не будут доставлены или приняты до пределов, установленных операционной системой для количества элементов в очереди данного сигнала.После этой точки любой другой сигнал, поступающий для этого типа сигнала, сбрасывается.
Если любая из этих ситуаций не соответствует действительности, то обрабатывается только поступающий в данный момент сигнал, а любые другие сигналы тот же тип сигнала , который поступает во время работы текущего обработчика сигнала, сбрасывается.Также, если вы блокируете сигнал, и два или более сигналов поступают в процесс и не доставляются, они объединяются в одно сигнальное событие.Но, опять же, это только в том случае, если вышеуказанные два условия не выполняются ... в противном случае несколько сигнальных событий одного типа ставятся в очередь.
Еще одно примечание ... два указанных условия относятся к спецификации POSIX,но Linux поставит в очередь любой сигнал в реальном времени, даже если SA_SIGINFO не установлен для этого сигнала.Так что это будет означать любой сигнал, соответствующий диапазону SIGRTMIN и SIGRTMAX.
Где находится сигнал в очереди, конкретное местоположение процесса или глобальное местоположение?
Он хранится вочередь на процесс.
Как обрабатываются сигналы в очереди, возможно ли, что два сигнала обрабатываются одновременно, или гарантированные сигналы будут обрабатываться один за другим?
Это зависит от того, как вы настроили обработчик сигнала с функциями sigaction
struture и sigaction()
.Не гарантируется, что любые другие сигналы будут заблокированы во время работы вашего обработчика сигналов.В строке sigaction
может быть установлена маска сигналов, определяющая, какие сигналы блокируются во время работы вашего обработчика сигналов.Сам сигнал блокируется до тех пор, пока обработчик сигнала не завершится, но другой сигнал может прервать ваш текущий обработчик сигнала, если он не заблокирован маской сигнала, установленной для обработчика сигнала, установленного в вашей структуре sigaction
.Поэтому все, что вы делаете в обработчике сигналов, должно быть асинхронно безопасным, и вы не должны вызывать какие-либо не асинхронно безопасные функции в вашем обработчике сигналов, такие как fprintf()
и т. Д. Поэтому гарантируется, что сам сигнал обрабатывается в FIFO.порядок (т. е. сигнал не прервет сам себя), но другие сигналы могут прервать ваш текущий обработчик сигнала, если вы не заблокировали его намеренно.Имейте в виду, что установка маски сигнала внутри вашего обработчика сигналов в попытке заблокировать другие сигналы от прерывания вашего обработчика является идеей очень плохой и не является атомарной операцией, поэтому не делайте этого.Если вы хотите, чтобы другие сигналы блокировались во время работы вашего обработчика сигналов, укажите маску сигналов в структуре sigaction
, которую вы передаете sigaction()
.