2013-04-02 6 views
5

Если процесс Linux ждет ввода/вывод сигнала (т.е. он находится в состоянии SLEEP) и SIGKILL сигнала выдается против него, по окончанию (STOPPED состояния) он будет проходить через RUNNING или READY состояния?SIGKILL обработка

Другими словами, для процесса обработки системного прерывания, например, генерируемого SIGKILL, необходимо пройти через RUNNING или READY состояние?

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

+0

'SIGKILL' - неудачный пример, поскольку это сигнал, который не может быть обработан процессом приема. Если ваш вопрос не связан с «SIGKILL», и это простой пример, попробуйте использовать другой сигнал, чтобы выразить то, что вы имеете в виду. – nemo

ответ

5

Сигнал «передается» процессу ядром, поэтому отправка сигнала от processA к processB использует ядро. Когда SIGKILL поставляется, ядро ​​не разрешает никакой активности процессом (пользовательский режим), в частности, обрабатывает изложение: atexit calls, _exit. Ничего. Система просто разрушается системой. Это связано с некоторой активностью в режиме ядра. Буферизованные данные теряются. Семафоры SYSV и другие постоянные объекты памяти ядра остаются в памяти. Это может быть настоящий беспорядок.

Если что-то в памяти ядра вызывает зависание вы используете интерфейс SysRq в Linux:

http://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/security-sysrq.html

--to выполнить любую видимость упорядоченного отключения вы можете получить.

Именно поэтому использование SIGKILL является абсолютным последним средством, поскольку вы не можете знать, что вы нарушаете. И он не будет исправлять все зависания.

В чем вы работаете?

+0

Я не думаю, что вопрос OP был специфическим для 'SIGKILL'. Я понимаю это скорее как «должен ли процесс быть активным, чтобы обрабатывать сигнал». – nemo

+0

Процесс должен иметь контекст cpu для приема сигналов. SIGKILL немного отличается. Процессы имеют два компонента - ядро ​​- иногда называемое P0, код земли пользователя, называемый P1. P0 и P1 просто возвращаются в непогружаемый пул с выгружаемым пулом и в системную память, когда ядро ​​получает SIGKILL. Некоторые вещи, такие как семафоры, остаются в памяти ядра. Поэтому в этом смысле P1 никогда не становится активным. Вы определенно можете утверждать, что некоторые действия P0 находятся в контексте процесса, но ваш код режима пользователя ничего не может с этим поделать. –

+0

Да, я знаю, что и ваше сообщение уже говорит, что «SIGKILL» не может быть обработано. Но я не думаю, что ОП просит «SIGKILL», но все сигналы в целом. Итак, ваше первое предложение вашего комментария - это ответ на вопрос об ИМО IM. – nemo

1

В дополнении к ответу Джима Макнамары:

SIGKILL (убить -9) не может быть обработан.

См. Ответ на https://stackoverflow.com/a/2541618/1456519 для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^