Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Как это работает [ править ]

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

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

Очистить [ править ]

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

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

Сироты и зомби [ править ]

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

Примеры [ править ]

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

КОБОЛ :

 ИДЕНТИФИКАЦИОННЫЙ  ОТДЕЛ .  ПРОГРАММА-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.

См. Также [ править ]

Ссылки [ править ]

Внешние ссылки [ править ]

  • exit: завершить процесс - Справочник по системным интерфейсам, Единая спецификация UNIX , Выпуск 7 от The Open Group
  • Справочник по C ++ для std::exit