exit (системный вызов) - exit (system call)

редактировать

На многих компьютерах операционных системах компьютерный процесс завершает свое выполнение , выполняя системный вызов exit. В более общем смысле, выход в многопоточной среде означает, что выполнение потока прекратило работу. Для управления ресурсами операционная система восстанавливает ресурсы (память, файлы и т. Д.), Которые использовались по процессу. Процесс называется мертвым процессом после его завершения.

Содержание

  • 1 Как это работает
    • 1.1 Очистка
    • 1.2 Сироты и зомби
  • 2 Примеры
  • 3 Windows
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

Как это работает

В Unix и Unix-like операционных системах процесс запускается, когда его родительский процесс выполняет системный вызов fork . Затем родительский процесс может ждать завершения дочернего процесса или может продолжить выполнение (возможно, отключив другие дочерние процессы). Когда дочерний процесс завершается («умирает»), либо обычно, вызывая exit, либо ненормально из-за фатального исключения или сигнала (например, SIGTERM, SIGINT, SIGKILL ), статус выхода возвращается в операционную систему, а сигнал SIGCHLD отправляется в родительский процесс. Затем родительский процесс может получить статус выхода с помощью системного вызова wait.

Большинство операционных систем позволяют завершающему процессу предоставлять системе определенный статус выхода, который становится доступным для родительского процесса. Обычно это целое число, хотя некоторые операционные системы (например, Plan 9 от Bell Labs ) допускают возврат строки символов . Системы, возвращающие целочисленное значение, обычно используют нулевое значение, чтобы указать успешное выполнение, и ненулевые значения, чтобы указать условия ошибки. В других системах (например, OpenVMS ) используются четные значения для успеха и нечетные значения для ошибок. В других системах (например, IBM z / OS и его предшественники) используются диапазоны целочисленных значений для обозначения результатов успешного выполнения, предупреждения и завершения ошибки.

Очистить

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

Иногда можно обойти обычную очистку; C99 предлагает функцию _exit (), которая завершает текущий процесс без дополнительной очистки программы. Это может использоваться, например, в подпрограмме fork-exec, когда вызов exec не может заменить дочерний процесс; вызов подпрограмм atexitприведет к ошибочному освобождению ресурсов, принадлежащих родителю.

Сироты и зомби

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

Примеры

Следующие программы завершаются и возвращают системе успешный статус выхода.

C :
#include int main (void) {exit (EXIT_SUCCESS); / * или вернуть EXIT_SUCCESS * /}
C ++ :
#include int main () {std :: exit (EXIT_SUCCESS); // или вернуть EXIT_SUCCESS}

COBOL :

IDENTIFICATION DIVISION. ПРОГРАММА-ID. УСПЕХ-ПРОГРАММА. ПРОЦЕДУРА ОТДЕЛЕНИЯ. ОСНОВНОЙ. ПЕРЕМЕСТИТЕ НОЛЬ ДЛЯ ВОЗВРАТА КОДА. КОНЕЦ ПРОГРАММЫ.

Fortran :

программный вызов вики-страницы exit (0) end program wiki

Java :

открытый класс Success {public static void main (String args) {System.exit (0); }}

Паскаль :

программный вики; begin ExitCode: = 0; выход конец.

ПК DOS Пакетный файл :

exit 0

Perl :

#! / Usr / bin / env perl exit;

PHP :

Python :

#! / Usr / bin / env python3 import sys sys.exit (0)

Оболочка Unix :

exit 0

PC DOS Сборка :

; Для MASM / TASM.MODEL SMALL.STACK.CODE main PROC NEAR MOV AH, 4Ch; Служба 4Ch - Завершить с кодом ошибки MOV AL, 0; Код ошибки INT 21h ; Прерывание 21h - DOS General Прерывания main ENDP END main; Начинается с main

Некоторые программисты могут подготовить все для INT 21h сразу:

MOV AX, 4C00h; замените 00 своим кодом ошибки в HEX

Linux 32-bit x86 Assembly:

; Для NASM MOV AL, 1; Функция 1: exit () MOV EBX, 0; Код возврата; # Передает управление вектору прерывания # вызывает системный вызов - в данном случае системный вызов №1 с аргументом 0
# Для GAS. text.global _start _start: movl $ 1,% eax # Системный вызов номер 1: exit () movl $ 0,% ebx # Завершает работу с статусом выхода 0 int $ 0x80 # Передает управление вектору прерывания # вызывает системный вызов - в данном случае системный вызов №1 с аргументом 0

Linux 64-бит x86 64 Сборка: для FASM

форматировать исполняемый файл ELF64 3 записи начальный сегмент читаемый запуск исполняемого файла:; ВЕЩАНИЕ; выход из mov eax, 60; sys_exit номер системного вызова: 60 ​​xor edi, edi; установить статус выхода в 0 (`xor edi, edi` равно` mov edi, 0`) syscall; назовите его

Windows

В Windows программа может завершить себя, вызвав функцию ExitProcess или RtlExitUserProcess.

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-19 09:44:59
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте