Во многих операционных системах компьютерный процесс завершает свое выполнение , выполняя системный вызов выхода . В более общем смысле выход в многопоточной среде означает, что поток выполнения прекратил работу. Для управления ресурсами операционная система возвращает ресурсы ( память , файлы и т. д.), которые использовались процессом. Процесс считается мертвым после его завершения.
В Unix и Unix-подобных операционных системах процесс запускается, когда его родительский процесс выполняет системный вызов fork . Затем родительский процесс может дождаться завершения дочернего процесса или продолжить выполнение (возможно, ответвив другие дочерние процессы). Когда дочерний процесс завершается («умирает»), либо нормально, вызывая exit , либо ненормально из -за фатального исключения или сигнала (например, SIGTERM , SIGINT , SIGKILL ), операционной системе возвращается статус завершения , а родительскому процессу отправляется сигнал SIGCHLD . Затем родительский процесс может получить статус завершения с помощью системного вызова wait .
Большинство операционных систем позволяют завершающемуся процессу предоставлять системе определенный статус выхода , который становится доступным родительскому процессу. Обычно это целочисленное значение, хотя некоторые операционные системы (например, Plan 9 из Bell Labs ) позволяют возвращать строку символов . Системы, возвращающие целочисленное значение, обычно используют нулевое значение для указания успешного выполнения и ненулевые значения для указания условий ошибки. Другие системы (например, OpenVMS ) используют четные значения для успеха и нечетные значения для ошибок. Другие системы (например, IBM z/OS и ее предшественники) используют диапазоны целочисленных значений для указания результатов успешного завершения, предупреждения и ошибки.
Операция выхода обычно выполняет операции очистки в пространстве процесса перед возвратом управления обратно операционной системе. Некоторые системы и языки программирования позволяют регистрировать пользовательские подпрограммы , чтобы они вызывались при завершении программы до того, как процесс фактически завершится навсегда. В качестве последнего шага завершения вызывается примитивный системный вызов выхода, информирующий операционную систему о завершении процесса и позволяющий ей вернуть ресурсы, используемые процессом.
Иногда можно обойти обычную очистку; C99 предлагает _exit()
функцию, которая завершает текущий процесс без какой-либо дополнительной очистки программы. Это может быть использовано, например, в процедуре fork-exec , когда exec
вызов не может заменить дочерний процесс; вызывающие atexit
процедуры ошибочно освобождают ресурсы, принадлежащие родительскому процессу.
Некоторые операционные системы обрабатывают дочерний процесс, родительский процесс которого завершился особым образом. Такой сиротский процесс становится дочерним процессом специального корневого процесса , который затем ждет завершения дочернего процесса. Аналогично, похожая стратегия используется для работы с зомби-процессом , который является дочерним процессом, который завершился, но статус завершения которого игнорируется его родительским процессом. Такой процесс становится дочерним процессом специального родительского процесса, который извлекает статус завершения дочернего процесса и позволяет операционной системе завершить завершение мертвого процесса. Обработка этих особых случаев поддерживает таблицу системных процессов в согласованном состоянии.
Следующие программы завершаются и возвращают системе статус успешного выхода .
КОБОЛ :
ИДЕНТИФИКАЦИЯ РАЗДЕЛЕНИЕ . ПРОГРАММА-ID . УСПЕШНАЯ-ПРОГРАММА . ПРОЦЕДУРА РАЗДЕЛЕНИЕ . ГЛАВНАЯ . ПЕРЕМЕЩЕНИЕ НУЛЯ В КОД- ВОЗВРАТА . ЗАВЕРШЕНИЕ ПРОГРАММЫ .
Фортран :
программа вики вызов выход ( 0 ) конец программы вики
Ява :
public class Success { public static void main ( String [] args ) { System . exit ( 0 ); } }
Паскаль :
программа вики ; начало ExitCode := 0 ; выход конец .
Пакетный файл DR-DOS : [1]
выход 0
Перл :
#!/usr/bin/env perl выход ;
PHP-код :
<?php выход ( 0 );
Питон :
#!/usr/bin/env python3 импорт sys sys .выход ( 0 )
выход 0
Сборка DOS :
; Для МАСМ / ТАСМ.МОДЕЛЬ МАЛАЯ.КУЧА.КОДосновной ПРОЦ РЯДОМ MOV AH, 4Ch ; Служба 4Ch - Завершение с кодом ошибки MOV AL, 0 ; Код ошибки INT 21h ; Прерывание 21h - Общие прерывания DOSосновной ЕНДПEND main ; Начинается с main
Некоторые программисты могут подготовить все для INT 21h сразу:
MOV AX, 4C00h ; замените 00 на код ошибки в HEX
Linux 32-бит x86 Сборка:
; Для НАСМMOV AL, 1 ; Функция 1: выход()MOV EBX, 0 ; Код возвратаINT 80h ; # Передает управление вектору прерывания # вызывает системный вызов — в данном случае системный вызов # номер 1 с аргументом 0
# Для ГАЗА.текст.глобальный _старт_начинать: movl $1, %eax # Системный вызов номер 1: exit() movl $0, %ebx # Выход со статусом выхода 0 int $0x80 # Передает управление вектору прерывания # вызывает системный вызов — в данном случае системный вызов # номер 1 с аргументом 0
Linux 64-бит x86 64 Сборка: для FASM
формат ELF64 исполняемый файл 3 запись начало сегмента чтение исполняемый файл начало: ; STUFF ; выход mov eax , 60 ; sys_exit номер системного вызова: 60 xor edi , edi ; установить статус выхода на 0 (`xor edi, edi` равно `mov edi, 0` ) системный вызов ; вызвать его
OS X 64-бит x86 64 Сборка: для NASM
глобальный _main раздел .текст _main: mov rax , 0x02000001 ; sys_exit номер системного вызова: 1 (добавьте 0x02000000 для OS X) xor rdi , rdi ; установите статус выхода на 0 (`xor rdi, rdi` равно `mov rdi, 0`) системный вызов ; вызов exit()
В Windows программа может завершить себя, вызвав функцию ExitProcess или RtlExitUserProcess.
{{cite book}}
: |work=
игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT
Это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включающая описание многих недокументированных функций и внутренних компонентов. Она является частью еще более обширной MPDOSTIP.ZIP
коллекции автора, которая поддерживалась до 2001 года и распространялась на многих сайтах в то время. Приведенная ссылка указывает на более старую версию файла, преобразованную в HTML.) [1]