stringtranslate.com

выход (системный вызов)

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

Как это работает

В 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 )

Оболочка Unix :

выход 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.

Смотрите также

Ссылки

  1. ^ Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. «II.4. Недокументированные внешние команды». NWDOS-TIPs — советы и подсказки для Novell DOS 7, с просмотром недокументированных подробностей, ошибок и обходных путей. Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 5 ноября 2016 г. Проверено 11 января 2012 г. {{cite book}}: |work=игнорируется ( помощь ) (Примечание. NWDOSTIP.TXTЭто всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включающая описание многих недокументированных функций и внутренних компонентов. Она является частью еще более обширной MPDOSTIP.ZIPколлекции автора, которая поддерживалась до 2001 года и распространялась на многих сайтах в то время. Приведенная ссылка указывает на более старую версию файла, преобразованную в HTML.) [1]

Внешние ссылки