stringtranslate.com

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

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

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

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

Оболочка Unix :

выход 0 

DOS- сборка :

; Для МАСМ / ТАСМ.МОДЕЛЬ МАЛЕНЬКАЯ.КУЧА.КОДосновной ПРОЦ БЛИЖАЙШИЙ МОВ АХ, 4Ch ; Сервис 4Ch – Завершить с кодом ошибки MOV AL, 0 ; Код ошибки  INT 21h  ; Прерывание 21h — Общие прерывания DOSосновной ЕНДПКОНЕЦ основного ; Начинается с главного

Некоторые программисты могут подготовить все для INT 21h сразу:

 МОВ АКС, 4C00h ; замените 00 кодом ошибки в HEX

Linux 32-битная сборка x86 :

; Для НАСММОВ АЛ, 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.

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

Рекомендации

  1. ^ Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. «II.4. Undocumentierte Eigenschaften externer Kommandos». 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]

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