Описание тега monitor-calibration
На 130 - (128+радиоразведки) вы видите в $?
после последней команды умер от радиоразведки-это упрощенное представление ее статус выхода некоторых снарядов, как Баш
. Другие снаряды будут использовать различные представления (например, 256+Сигнум в ksh93, 128+256+Сигнум в Яш, текстовое представление, как сигнал SIGINT
или на которых он слушал с ниппелем
в РК
/Эс
). Ознакомиться по умолчанию код выхода, когда процесс завершен? для получения более подробной информации по этому.
Процесс может ждать, пока дочерний процесс, и запросить статус:
- если оно было остановлено (с которой сигнал)
- если оно было возобновлено
- если он был убит (с которого сигнал)
- если он в ловушке (для вызова ptraceпроцессов)
- если он сбросил ядра
- если он вышел нормально С
для _exit()
системного вызова (с которого выход код)
Для этого они используют один из ждать()
, с помощью waitpid()
, waitid()
(см. также устаревшие wait3()
, wait4()
) или обработчик сигнала sigchld на системный вызов.
Эти системные вызовы возвращают все, что выше информация. (За исключением waitid()
на некоторых системах, только самые низкие 8 битов числа, переданного для _exit()
для детей, которые заканчиваются, как правило, доступны).
Но в bash
(и большинство Борна-как и csh-как ракушки) пачка всю эту информацию в 8 бит количество за $?
($?
самые низкие 8 битов кода выхода для процессов, которые обычно завершают, а 128+Сигнум он был убит или отстранен или в ловушке, все остальные данные не доступны). Так что, очевидно, есть некоторая информация теряется. В частности, через $?
в одиночку, никто не может сказать, если процесс сделал для _exit(130)
или умер от радиоразведки.
Баш
знает, когда процесс будет убит явно. Например, когда убивают фоновые процессы, вы видите:
[1]+ прервать сон 20
Но в $?
, она не дает вам достаточно информации, чтобы сказать, был ли он убит радиоразведки или называется для _exit(130)
.
Поскольку большинство снарядов сделать это преобразование, приложений, знать лучше, чем делать для _exit(number_greater_than_127)
ни за что, но смерть от сигнала хотя.
Тем не менее, если процесс не для _exit(130)
, процесс ждет, что процесс будет обнаружить, что этот процесс прекращается, как правило, не в том, что он был убит по сигналу. В C, WIFEXITED()
будет возвращать истинным, WIFSIGNALED()
будет возвращать false.
Баш
сам не буду рассматривать процесс как умер от радиоразведки (хотя это позволяет думаю, что это возможно через $?
содержащие такое же значение, как если бы он умер от радиоразведки).
Так, что не вызывают особой обработки сигнала SIGINT, что баш
делает. В скрипте, как Баш
и текущую команду в скрипт получает сигнал SIGINT при ^С
(как они оба в одном процессе группы).
Баш
умирает при получении сигнала SIGINT только если команда его ждет тоже умер от радиоразведки (идея в том, что если например в вашем скрипте, вы запускаете VI или меньше, и использовать ^C, чтобы прервать что-то там не делает ви
/меньше
умирать, ваш скрипт не умирает по возвращении бросить ви
/менее
позже).
Если эта команда Баш
ждет не для _exit(130)
в обработчик сигнала SIGINT, Баш
не умереть при этом сигнал SIGINT (он не считает себя как будто они были прерваны, потому что он не верит, что ребенок был прерван).
Вот почему, когда вы хотите сообщить о смерти радиоразведки, что вы действительно были прерваны, хотя на самом деле вы делаете некоторую дополнительную обработку после получения этого сигнала в обработчик, вы должны не делать для _exit(130)
, но на самом деле убить себя с SIGINT (после восстановления по умолчанию обработчик сигнала SIGINT). В оболочке, вот с:
ловушка '
дополнительной обработки
ловушка - ИНТ # восстановить обработчик сигнала SIGINT
убить -ы ИНТ " отчет$$" # родителю, что мы действительно были
# прерывается
'ИНТ