О доставке стандартных сигналов - PullRequest
5 голосов
/ 14 июня 2011

В отличие от этого, если несколько экземпляров стандартного сигнала доставляются в то время, когда этот сигнал в настоящее время заблокирован , тогда в очередь ставится только один экземпляр.

Я думаю,Приведенное выше описание не столь понятно и вызывает у меня двусмысленность:

что, если конкретный сигнал не будет заблокирован , будут ли в очереди несколько экземпляров одного и того же сигнала?

Гденаходится в очереди сигнал, определенное для процесса местоположение или глобальное местоположение?

Как обрабатываются поставленные в очередь сигналы, возможно ли, что два сигнала обрабатываются одновременно, или гарантированные сигналы будут обрабатываться по одномупо одному?

Так что на самом деле это 3 вопроса здесь ..

Ответы [ 4 ]

8 голосов
/ 14 июня 2011

что, если определенный сигнал не заблокирован, будут ли помещены в очередь несколько экземпляров одного и того же сигнала?

Это зависит от того, был ли установлен флаг SA_SIGINFO для сигнала с использованием sigaction структура и sigaction() функция, и есть ли в вашей системе правильное определение _POSIX_REALTIME_SIGNALS (современные ядра Linux делают).Если оба экземпляра истинны, то любые поступающие сигналы, которые соответствуют этим двум условиям, будут поставлены в очередь в очереди для каждого процесса до тех пор, пока они не будут доставлены или приняты до пределов, установленных операционной системой для количества элементов в очереди данного сигнала.После этой точки любой другой сигнал, поступающий для этого типа сигнала, сбрасывается.

Если любая из этих ситуаций не соответствует действительности, то обрабатывается только поступающий в данный момент сигнал, а любые другие сигналы тот же тип сигнала , который поступает во время работы текущего обработчика сигнала, сбрасывается.Также, если вы блокируете сигнал, и два или более сигналов поступают в процесс и не доставляются, они объединяются в одно сигнальное событие.Но, опять же, это только в том случае, если вышеуказанные два условия не выполняются ... в противном случае несколько сигнальных событий одного типа ставятся в очередь.

Еще одно примечание ... два указанных условия относятся к спецификации POSIX,но Linux поставит в очередь любой сигнал в реальном времени, даже если SA_SIGINFO не установлен для этого сигнала.Так что это будет означать любой сигнал, соответствующий диапазону SIGRTMIN и SIGRTMAX.

Где находится сигнал в очереди, конкретное местоположение процесса или глобальное местоположение?

Он хранится вочередь на процесс.

Как обрабатываются сигналы в очереди, возможно ли, что два сигнала обрабатываются одновременно, или гарантированные сигналы будут обрабатываться один за другим?

Это зависит от того, как вы настроили обработчик сигнала с функциями sigaction struture и sigaction().Не гарантируется, что любые другие сигналы будут заблокированы во время работы вашего обработчика сигналов.В строке sigaction может быть установлена ​​маска сигналов, определяющая, какие сигналы блокируются во время работы вашего обработчика сигналов.Сам сигнал блокируется до тех пор, пока обработчик сигнала не завершится, но другой сигнал может прервать ваш текущий обработчик сигнала, если он не заблокирован маской сигнала, установленной для обработчика сигнала, установленного в вашей структуре sigaction.Поэтому все, что вы делаете в обработчике сигналов, должно быть асинхронно безопасным, и вы не должны вызывать какие-либо не асинхронно безопасные функции в вашем обработчике сигналов, такие как fprintf() и т. Д. Поэтому гарантируется, что сам сигнал обрабатывается в FIFO.порядок (т. е. сигнал не прервет сам себя), но другие сигналы могут прервать ваш текущий обработчик сигнала, если вы не заблокировали его намеренно.Имейте в виду, что установка маски сигнала внутри вашего обработчика сигналов в попытке заблокировать другие сигналы от прерывания вашего обработчика является идеей очень плохой и не является атомарной операцией, поэтому не делайте этого.Если вы хотите, чтобы другие сигналы блокировались во время работы вашего обработчика сигналов, укажите маску сигналов в структуре sigaction, которую вы передаете sigaction().

3 голосов
/ 14 июня 2011

Это битовая маска - обратите внимание, что все стандартные сигналы имеют значения ниже 32?

Редактировать 0:

«Очередь» для стандартных сигналов представляет собой просто битовую маску на поток, поэтому, как только сигнал размещен и еще не доставлен, устанавливается данный бит, и передача того же сигнала теряется до тех пор, пока этот бит не будет очищен, т.е. сигнал доставлено.

Редактировать 1:

Мы можем надежно пожинать дочерние процессы, потому что этот механизм не зависит от сигналов только . Ядро хранит подробную информацию о происхождении процесса, и дочерний процесс не исчезает после его выхода, а остается в таблице процессов, чтобы родитель мог пожинать его (именно так мы и разводим зомби, верно :). Ожидание SIGCHLD означает «хотя бы один из ваших детей изменил состояние, окунитесь в ядро, чтобы собрать трупы». Гонка здесь не за сигнальной «очередью», а за таблицей процессов / деревом / чем угодно, и задача ядра - защитить ее.

2 голосов
/ 14 июня 2011

Один сигнал обрабатывается за раз, в каждом потоке. Во время работы обработчика сигналов все остальные сигналы автоматически блокируются.

Таким образом, невозможно поставить несколько одинаковых сигналов в один поток. Однако в очереди может появиться много разных сигналов.

Я предположил, что обработчик сигналов может разблокировать некоторые сигналы до его выхода, в этом случае вы рискуете переполнить стек сигналов (стек вызовов, используемый для обработчиков сигналов, а не очередь сигналов), если сигналы генерируются быстрее, чем они могли быть обработаны.

1 голос
/ 14 июня 2011

Если сигнал доставляется во время обработки того же сигнала, обработчик будет снова вызываться сразу после возврата из текущего вызова, поэтому будет многократная доставка сигнала.

Конечно, если сигнал отправляется несколько раз, покавсе еще обрабатывая первый, только один сигнал будет поставлен в очередь, и произойдет только один повторный вызов обработчика.

Сигналы помечены как «ожидающие» в структуре proc в ядре, поэтому для каждого процесса есть отдельная битовая маска сигнала и только одинСигнал каждого типа (SIGBUS, SIGINT, SIGUSR1 и т. д.) может быть ожидающим, но одновременно могут ожидаться несколько различных сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...