В этой статье не процитировать какие - либо источники . ( февраль 2019 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
На многих компьютерных операционных системах , процесс компьютера прекращает выполнение пути , сделав выход системного вызова . В более общем смысле, выход в многопоточной среде означает, что поток выполнения остановился. Для управления ресурсами , то операционная система высвобождает ресурсы ( память , файлы и т.д.) , которые были использованы в процессе. После завершения процесс называется мертвым процессом .
Как это работает [ править ]
В Unix и Unix-подобных операционных системах процесс запускается, когда его родительский процесс выполняет системный вызов fork . Затем родительский процесс может дождаться завершения дочернего процесса или продолжить выполнение (возможно, разветвление других дочерних процессов). Когда дочерний процесс завершается («умирает»), либо обычно, вызывая exit , либо ненормально из-за фатального исключения или сигнала (например, SIGTERM , SIGINT , SIGKILL ), статус выходавозвращается в операционную систему, и родительскому процессу отправляется сигнал SIGCHLD . Затем родительский процесс может получить статус выхода с помощью системного вызова wait .
Большинство операционных систем позволяют завершающему процессу предоставлять системе определенный статус выхода , который становится доступным для родительского процесса. Обычно это целое число, хотя некоторые операционные системы (например, Plan 9 от Bell Labs ) позволяют возвращать символьную строку . Системы, возвращающие целочисленное значение, обычно используют нулевое значение, чтобы указать успешное выполнение, и ненулевые значения, чтобы указать условия ошибки. Другие системы (например, OpenVMS ) используют четные значения для успеха и нечетные значения для ошибок. В других системах (например, IBM z / OS и ее предшественниках) используются диапазоны целочисленных значений для индикации результатов успешного выполнения, предупреждения и завершения ошибки.
Очистить [ править ]
Операция выхода обычно выполняет операции очистки в пространстве процесса перед возвратом управления обратно операционной системе. Некоторые системы и языки программирования позволяют регистрировать пользовательские подпрограммы, чтобы они вызывались при завершении программы до того, как процесс окончательно завершится. В качестве последнего шага завершения вызывается примитивный системный вызов выхода, информирующий операционную систему о завершении процесса и позволяющий ей вернуть ресурсы, используемые процессом.
Иногда можно обойти обычную очистку; C99 предлагает _exit()
функцию, которая завершает текущий процесс без дополнительной очистки программы. Это может использоваться, например, в подпрограмме fork-exec, когда exec
вызов не может заменить дочерний процесс; Вызов atexit
подпрограмм по ошибке освободит ресурсы, принадлежащие родителю.
Сироты и зомби [ править ]
Некоторые операционные системы обрабатывают дочерний процесс, родительский процесс которого завершился особым образом. Такой процесс-сирота становится дочерним по отношению к специальному корневому процессу , который затем ожидает завершения дочернего процесса. Аналогичным образом, аналогичная стратегия используется для работы с процессом зомби , который является дочерним процессом, который завершился, но статус выхода которого игнорируется его родительским процессом. Такой процесс становится дочерним по отношению к специальному родительскому процессу, который получает статус выхода дочернего процесса и позволяет операционной системе завершить завершение мертвого процесса. Работа с этими частными случаями поддерживает согласованное состояние системной таблицы процессов .
Примеры [ править ]
Следующие программы завершают работу и возвращают системе статус успешного завершения.
C :
| C ++ :#include <cstdlib>int main () { std :: exit ( EXIT_SUCCESS ); // или вернуть EXIT_SUCCESS } |
КОБОЛ :
ИДЕНТИФИКАЦИОННЫЙ ОТДЕЛ . ПРОГРАММА-ID . УСПЕХ-ПРОГРАММА . ПРОЦЕДУРА ОТДЕЛЕНИЯ . ГЛАВНАЯ . ПЕРЕМЕСТИТЕ НОЛЬ ДЛЯ ВОЗВРАТА КОДА . КОНЕЦ ПРОГРАММЫ .
Фортран :
программа wiki call exit ( 0 ) конец программы wiki
Java :
открытый класс Success { public static void main ( String [] args ) { System . выход ( 0 ); } }
Паскаль :
программа вики ; begin ExitCode : = 0 ; выход конец .
Пакетный файл PC DOS :
выход 0
Perl :
#! / usr / bin / env perl exit ;
PHP :
<? php exit ( 0 );
Python :
#! / usr / bin / env python3 import sys sys . выход ( 0 )
Оболочка Unix :
выход 0
Сборка ПК DOS :
; Для MASM / TASM.МОДЕЛЬ МАЛЫЙ.КУЧА.КОДосновной ПРОК РЯДОМ МОВ АХ, 4Ч ; Служба 4Ch - завершение с кодом ошибки MOV AL, 0 ; Код ошибки INT 21h ; Прерывание 21h - Общие прерывания DOSосновной ENDPEND main; Начинается на главном
Некоторые программисты могут подготовить к INT 21h сразу все:
MOV AX, 4C00h ; замените 00 своим кодом ошибки в HEX
32-разрядная сборка Linux x86 :
; Для NASMМОВ АЛ, 1; Функция 1: exit ()MOV EBX, 0; Код возвратаINT 80h ; # Передает управление вектору прерывания # вызывает системный вызов - в данном случае системный вызов # номер 1 с аргументом 0
# Для ГАЗА.текст.global _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.
См. Также [ править ]
|
|
Ссылки [ править ]
Внешние ссылки [ править ]
- : завершить процесс - Справочник по системным интерфейсам, Единая спецификация UNIX , Выпуск 7 от The Open Group
- Справочник по C ++ для std::exit