выход (системный вызов)
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2019 г. ) |
Во многих компьютерных операционных системах компьютерный процесс завершает свое выполнение , выполнив выхода системный вызов . В более общем смысле выход в многопоточной среде означает, что поток выполнения остановился. Для управления ресурсами операционная система освобождает ресурсы ( память , файлы и т. д.), которые были использованы процессом. процесс считается мертвым После завершения .
Как это работает
[ редактировать ]В Unix и Unix-подобных операционных системах процесс запускается, когда его родительский процесс выполняет fork системный вызов . Родительский процесс может затем дождаться завершения дочернего процесса или продолжить выполнение (возможно, отделив другие дочерние процессы). Когда дочерний процесс завершается («умирает»), либо обычно путем вызова выхода , либо ненормально из-за фатального исключения или сигнала (например, SIGTERM , SIGINT , SIGKILL ), статус завершения возвращается в операционную систему, и SIGCHLD сигнал отправляется родительскому процессу. Статус выхода затем может быть получен родительским процессом с помощью системного вызова ожидания .
Большинство операционных систем позволяют завершающемуся процессу предоставлять определенный статус завершения системе , который становится доступным родительскому процессу. Обычно это целочисленное значение, хотя некоторые операционные системы (например, Plan 9 от Bell Labs ) позволяют строку символов возвращать . Системы, возвращающие целочисленное значение, обычно используют нулевое значение для обозначения успешного выполнения и ненулевые значения для обозначения условий ошибки. Другие системы (например, OpenVMS ) используют четные значения для успеха и нечетные значения для ошибок. Другие системы (например, IBM z/OS и ее предшественники) используют диапазоны целочисленных значений для обозначения результатов успешного завершения, предупреждения и ошибки.
Очистить
[ редактировать ]Операция выхода обычно выполняет операции очистки в пространстве процесса перед возвратом управления операционной системе. Некоторые системы и языки программирования пользовательские подпрограммы позволяют регистрировать , чтобы они вызывались при завершении программы до того, как процесс фактически завершится окончательно. На последнем этапе завершения вызывается примитивный системный вызов выхода, информирующий операционную систему о том, что процесс завершился, и позволяет ей вернуть ресурсы, используемые процессом.
Иногда можно обойти обычную очистку; C99 предлагает _exit()
функция, которая завершает текущий процесс без какой-либо дополнительной очистки программы. Это можно использовать, например, в процедуре fork-exec, когда exec
вызов не может заменить дочерний процесс; звоню atexit
подпрограммы будут ошибочно освобождать ресурсы, принадлежащие родительскому элементу.
Сироты и зомби
[ редактировать ]Некоторые операционные системы обрабатывают дочерний процесс, родительский процесс которого завершился особым образом. Такой осиротевший процесс становится дочерним по отношению к специальному корневому процессу , который затем ожидает завершения дочернего процесса. Аналогично, аналогичная стратегия используется для борьбы с процессом-зомби , который является дочерним процессом, который завершился, но статус завершения которого игнорируется его родительским процессом. Такой процесс становится дочерним по отношению к специальному родительскому процессу, который получает статус завершения дочернего процесса и позволяет операционной системе завершить завершение мертвого процесса. Работа с этими особыми случаями позволяет поддерживать таблицу системных процессов в согласованном состоянии.
Примеры
[ редактировать ]Следующие программы завершают работу и возвращают статус успешного выхода системе .
С :
|
С++ :
#include <cstdlib>
int main()
{
std::exit(EXIT_SUCCESS); // or return EXIT_SUCCESS
}
|
КОБОЛ :
IDENTIFICATION DIVISION.
PROGRAM-ID. SUCCESS-PROGRAM.
PROCEDURE DIVISION.
MAIN.
MOVE ZERO TO RETURN-CODE.
END PROGRAM.
Фортран :
program wiki
call exit(0)
end program wiki
Ява :
public class Success
{
public static void main(String[] args)
{
System.exit(0);
}
}
Паскаль :
program wiki;
begin
ExitCode := 0;
exit
end.
exit 0
Перл :
#!/usr/bin/env perl
exit;
PHP :
<?php
exit(0);
Питон :
#!/usr/bin/env python3
import sys
sys.exit(0)
exit 0
; For MASM/TASM .MODEL SMALL .STACK .CODE main PROC NEAR MOV AH, 4Ch ; Service 4Ch - Terminate with Error Code MOV AL, 0 ; Error code INT 21h ; Interrupt 21h - DOS General Interrupts main ENDP END main ; Starts at main
Некоторые программисты могут подготовить все для INT 21h сразу:
MOV AX, 4C00h ; replace the 00 with your error code in HEX
сборка Linux 32-битная x86 :
; For NASM MOV AL, 1 ; Function 1: exit() MOV EBX, 0 ; Return code INT 80h ; # Passes control to interrupt vector # invokes system call—in this case system call # number 1 with argument 0
# For GAS .text .global _start _start: movl $1, %eax # System call number 1: exit() movl $0, %ebx # Exits with exit status 0 int $0x80 # Passes control to interrupt vector # invokes system call—in this case system call # number 1 with argument 0
Linux 64-бит x86 64 Сборка: для FASM
format ELF64 executable 3
entry start
segment readable executable
start:
; STUFF
; exiting
mov eax, 60 ; sys_exit syscall number: 60
xor edi, edi ; set exit status to 0 (`xor edi, edi` is equal to `mov edi, 0` )
syscall ; call it
OS X 64-битная x86 64 Сборка: для NASM
global _main
section .text
_main:
mov rax, 0x02000001 ; sys_exit syscall number: 1 (add 0x02000000 for OS X)
xor rdi, rdi ; set exit status to 0 (`xor rdi, rdi` is equal to `mov rdi, 0` )
syscall ; call exit()
Окна
[ редактировать ]В Windows программа может завершиться, вызвав функцию ExitProcess или RtlExitUserProcess.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. «II.4. Недокументированные свойства внешних команд». NWDOS-TIPs — Советы и рекомендации по Novell DOS 7 с учетом недокументированных подробностей, ошибок и обходных путей . Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 5 ноября 2016 г. Проверено 11 января 2012 г.
{{cite book}}
:|work=
игнорируется ( помощь ) (NB.NWDOSTIP.TXT
представляет собой исчерпывающую работу по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной работы автора.MPDOSTIP.ZIP
Коллекция сохранялась до 2001 года и в то время распространялась на многих сайтах. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML.) [1]
Внешние ссылки
[ редактировать ]- Единая спецификация UNIX , версия 4 от The Open Group : завершить процесс – Справочник по системным интерфейсам,
- Справочник по C++ для
std::exit