Может ли процесс Linux завершиться с помощью механизма, отличного от фатального сигнала или вызова `exit(2)`?

#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) для фактического выхода из процесса.