Попытка видеть обработчики по умолчанию для различных сигналов

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

Сигналы прибывают в два аромата, синхронные и асинхронные. Синхронные начинаются с ядра в ответ на что-то, что процесс сделал - например, когда-либо популярный SIGSEGV. Асинхронные сигналы обычно прибывают из других процессов, и, поскольку имя подразумевает, прибудьте в некоторую произвольную точку. "Незаконченный" сигнал является или тем, который просто еще не был поставлен, или тот, который был заблокирован временно процессом получения. Рассмотрите некоторые незаконченные сценарии и почему это было бы несоответствующим, чтобы ребенок наследовал их.

Синхронный, непоставленный: Давайте возьмем пример SIGSEGV, это находится на рассмотрении, потому что родитель фиксировал нарушение прав доступа - что-то, что я уверен, на самом деле не происходит или, оказывается, довольно долго действительно не рассматривает это как "ожидающий" с точки зрения пространства пользователя, но ради аргумента - затем это - родитель, который совершил нарушение, не ребенка. Если ребенок затем продолжит делать что-то подобное (который оно, вероятно, было бы), то это получит свой собственный сигнал так или иначе. Если случайно это не делает, то это не должно получать тот, который находился на рассмотрении для родителя.

Асинхронный, непоставленный: В этом случае это действительно не может быть значимо, если сигнал находился на рассмотрении на время ветвления и затем поставил к родителю, так как сигнал является асинхронным - это не может быть предназначено для прерывания процесса в конкретной точке, это похоже на телефонный вызов; вызывающая сторона не намеревается поймать Вас, в то время как Вы все еще сидите на своем стуле, потому что вызывающая сторона не может знать это. Точка вызова должна только передать что-то Вам. Далее, сигналы адресованы определенному процессу, и ребенок является отдельным процессом с его собственным PID. Если я отправлю сигнал обработать 1001, то я не ожидаю, что это также пойдет для обработки 1002.

Заблокированный (синхронный или асинхронный): В этом случае сигнал оставлен открытым намеренно процессом, таким образом, он имел возможность разблокировать его перед ветвлением (но не сделал). Так как известно, что такие сигналы не будут наследованы ребенком, этот сценарий происходит дизайном. Например, сервер получает сигнал и для того, что когда-либо рассуждает, решает заблокировать его временно, в то время как он отвечает на входящий запрос- pselect() выполнит это, я думаю - и обрабатывать запрос, он разветвляет ребенка. Затем это имеет дело с незаконченным сигналом.

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

Это кажется интегралом понятию ветвления: ребенок является копией родителя. Обработчики сигналов являются просто регулярными функциями с особым назначением. Снова, так как это известно, это может быть использовано дизайном, или с другой стороны, компенсировано. Достаточно легко удалить обработчик, если Вы больше не хотите использовать его.

3
14.12.2014, 06:23
1 ответ

Нет «файла», как вы хотите увидеть, если вы не хотите читать код ядра.

Это немного упрощенно. См. Главу в RAGO & Stevens на сигналах «Расширенное программирование в среде Unix» для намного больше информации.

Есть две части для «обработки сигналов по умолчанию». Они встроены в ядро. Когда планировщик замечает, что существует ожидающий сигнал для процесса, он придает процессу CPU при необходимости (контекстный переключатель). Далее сигнал доставляется в процесс. Процесс имеет сигнальную маску, которая позволяет им игнорировать много сигналов, если маска сознательно установлена, два сигнала SIGKILL и SIGSTOP не могут быть проигнорированы или заблокированы. Таким образом, процесс теперь имеет сигнал. Если не установлен обработчик, ядро ​​требует действий по умолчанию для сигнала.

Существует список действий по умолчанию для сигналов. Sigsegv, например, завершает процесс после того, как он сбросил ядро. Майкл Керриск имеет объяснение действий по умолчанию. Это то, что я думаю, вы хотите.

http://man7.org/linux/man-pages/man7/signal.7.html

Ядро имеет код для обработки всех ответов по умолчанию этих сигналов для процесса.

Если ядро ​​получает сигнал для «самого» (в зависимости от того, о каком вкусе Unix мы говорим о) ядра панике, пишет аварийный срок и оставляет вас головной болью. - Что не то, что вы хотите.

7
27.01.2020, 21:12

Теги

Похожие вопросы