Для простоты, давайте предположим, что процесс A имеет только один поток, который блокирует в вызове pause()
, и ровно один сигнал посылается процессу.
Процесс A возобновляется первым или обработчик выполняется первым?
Сначала выполняется обработчик сигнала, затем возвращается вызов pause()
.
Что, если есть несколько сигналов?
Стандартные сигналы не ставятся в очередь, поэтому, если вы отправите, скажем, два INT
сигнала в процесс очень быстро подряд, будет доставлен только один из них.
Если имеется несколько сигналов, порядок не указывается.
А как насчет сигналов реального времени POSIX?(SIGRTMIN+0
до SIGRTMAX-0
)
Они похожи на стандартные именованные сигналы, за исключением того, что они поставлены в очередь (до предела), и если более одного из них ожидает рассмотрения, они доставляются в возрастающем числовом порядке..
Если ожидают как стандартные сигналы, так и сигналы в реальном времени, неизвестно, какие из них будут доставлены первыми;хотя на практике в Linux и многих других системах сначала доставляются стандартные сигналы, а затем сигналы реального времени.
Что, если в процессе есть несколько потоков?
Ядро выберет один поток из тех, у которых сигнал не маскируется (через sigprocmask()
или pthread_sigmask()
), и использует этот поток для доставки сигнала обработчику сигнала.
Еслипри вызове pause()
блокируется более одного потока, один из них просыпается.Если имеется более одного ожидающего сигнала, то не определено, обрабатывает ли один пробужденный поток их всех, или разбудили более одного потока.
В общем, я настоятельно рекомендую прочитатьman 7 signal
, man 7 signal-safety
, man 2 sigaction
, man 2 sigqueue
и man 2 sigwaitinfo
справочные страницы.(Хотя ссылки ведут на проект man-страниц Linux, каждая из страниц содержит раздел Conforming To, в котором указаны соответствующие стандарты, и поведение, специфичное для Linux, четко обозначено.)