Jump to content

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

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

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

[ редактировать ]

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

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

Очистить

[ редактировать ]

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

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

Сироты и зомби

[ редактировать ]

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

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

С :
#include <stdlib.h>

int main(void)
{
    exit(EXIT_SUCCESS); /* or return EXIT_SUCCESS */
}
С++ :
#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.

DR-DOS Пакетный файл : [1]

exit 0

Перл :

#!/usr/bin/env perl
exit;

PHP :

<?php
exit(0);

Питон :

#!/usr/bin/env python3
import sys
sys.exit(0)

Оболочка Unix :

exit 0

DOS -сборка :

; 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.

См. также

[ редактировать ]
  1. ^ Пол, Матиас Р. (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]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b2e24f72c8026e564337ccdaf74cc803__1687404840
URL1:https://arc.ask3.ru/arc/aa/b2/03/b2e24f72c8026e564337ccdaf74cc803.html
Заголовок, (Title) документа по адресу, URL1:
exit (system call) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)