#linux #linux-kernel
#linux #linux-ядро
Вопрос:
Насколько я знаю, ядро Linux может очистить запись процесса только в том случае, если этот процесс выполняет exit(2)
системный вызов или ему не удается обработать фатальный сигнал (например, SIGSEGV
, SIGABRT
SIGTERM
, SIGKILL
, и т.д.). Я знаю, что это SIGKILL
не может быть обработано и поэтому даже фактически не «доставляется» процессу.. это в какой-то степени соответствует тому, о чем я здесь думаю.
Предполагая, что само ядро остается неповрежденным и действительным (не заинтересованным в аппаратном сбое / завершении работы устройства / панике / и т.д.), существуют ли какие-либо другие способы уничтожения процесса?
Цель — обеспечить охват платформы отчетов о сбоях — я почти уверен, что фатальные сигналы exit(2)
— это единственные способы, которыми я могу умереть, но я хотел бы убедиться.
Комментарии:
1. Мне это кажется правильным. Единственным исключением является сбой системы в целом.
Ответ №1:
Да, я полагаю, вы правы в том, что это единственные возможности.
Вы можете подтвердить это из документации wait(2)
. Существуют два связанных макроса, WIFEXITED()
и WIFSIGNALED()
которые можно использовать для определения причины wait
возврата данного процесса. Других возможностей нет (я не считаю WIFSTOPPED()
, поскольку он используется для обнаружения приостановленных процессов, а не завершившихся процессов).
На самом деле, exit(3)
это не системный вызов, это функция библиотеки C. Системный вызов _exit(2)
. exit(3)
выполняет некоторую очистку C (например, удаление stdio
буферов и вызов atexit()
функций), а затем вызывает _exit(2)
для фактического выхода из процесса.