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