afslut (systemopkald) - exit (system call)
På mange computer operativsystemer , en computer proces opsiger sin henrettelse ved at gøre et exit -system opkald . Mere generelt en exit i et multi-threading miljø betyder, at en tråd af henrettelse har stoppet. For ressourcestyring , det operativsystem reklamation ressourcer ( hukommelse , filer , etc.), der blev brugt af processen. Processen siges at være en død proces, når den er afsluttet.
Hvordan det virker
Under Unix og Unix-lignende operativsystemer , er en proces i gang, når dens overordnede proces udfører en gaffel -system opkald . Forældreprocessen kan derefter vente på, at barnprocessen afsluttes, eller kan fortsætte med at udføre (muligvis forfalde andre barnprocesser). Når barnet proces ophører ( "matricer"), enten normalt ved at ringe exit , eller unormalt på grund af en fatal undtagelse eller signal (fx SIGTERM , SIGINT , SIGKILL ), en exit-status returneres til operativsystemet og en SIGCHLD signal sendt til den overordnede proces. Udgangen status kan derefter hentes af den overordnede proces via ventetiden systemet opkald.
De fleste operativsystemer tillader, at afslutningsprocessen giver systemet en bestemt exitstatus , som gøres tilgængelig for den overordnede proces. Typisk er dette en heltalsværdi, selvom nogle operativsystemer (f.eks. Plan 9 fra Bell Labs ) tillader, at en tegnstreng returneres. Systemer, der returnerer et heltal, bruger normalt en nulværdi til at angive en vellykket udførelse og værdier, der ikke er nul, til at angive fejlforhold. Andre systemer (f.eks. OpenVMS ) bruger lige værdier til succes og ulige værdier for fejl. Stadig andre systemer (f.eks. IBM z / OS og dets forgængere) bruger intervaller af heltalværdier til at indikere resultater, advarsler og fejlafslutning.
Ryd op
Afslutningsoperationen udfører typisk oprydningsoperationer inden for procesrummet, før kontrollen returneres til operativsystemet. Nogle systemer og programmeringssprog tillader brugernes subrutiner at blive registreret, så de udnyttes på programniveau afslutning før processen faktisk afsluttes til gode. Som det sidste trin i afslutningen påberåbes et primitivt systemudgangsopkald, der informerer operativsystemet om, at processen er afsluttet og giver det mulighed for at genvinde de ressourcer, der bruges af processen.
Det er undertiden muligt at omgå den sædvanlige oprydning; C99 tilbyder den _exit()
funktion, der afslutter den aktuelle proces uden nogen ekstra programoprydning. Dette kan for eksempel bruges i en fork-exec- rutine, når exec
opkaldet ikke erstatter barneprocessen; ringer atexit
rutiner ville fejlagtigt frigøre ressourcer, der tilhører moderselskabet.
Forældreløse og zombier
Nogle operativsystemer håndterer en underordnet proces, hvis forældreproces er afsluttet på en særlig måde. En sådan forældreløs proces bliver et barn af en særlig rodproces , som derefter venter på, at barneprocessen ophører. Ligeledes bruges en lignende strategi til at håndtere en zombieproces , som er en underordnet proces, der er afsluttet, men hvis exitstatus ignoreres af dens overordnede proces. En sådan proces bliver barnet til en særlig forældreproces, der henter barnets exitstatus og gør det muligt for operativsystemet at afslutte afslutningen af den døde proces. Håndtering af disse specielle tilfælde holder systemets procesbord i en konsistent tilstand.
Eksempler
Følgende programmer afslutter og returnerer en succes exit-status til systemet.
C :
|
C ++ :
#include <cstdlib>
int main()
{
std::exit(EXIT_SUCCESS); // or return EXIT_SUCCESS
}
|
COBOL :
IDENTIFICATION DIVISION.
PROGRAM-ID. SUCCESS-PROGRAM.
PROCEDURE DIVISION.
MAIN.
MOVE ZERO TO RETURN-CODE.
END PROGRAM.
Fortran :
program wiki
call exit(0)
end program wiki
Java :
public class Success
{
public static void main(String[] args)
{
System.exit(0);
}
}
Pascal :
program wiki;
begin
ExitCode := 0;
exit
end.
exit 0
Perl :
#!/usr/bin/env perl
exit;
PHP :
<?php
exit(0);
Python :
#!/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
Nogle programmører forbereder muligvis alt til INT 21h på én gang:
MOV AX, 4C00h ; replace the 00 with your error code in HEX
; 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-bit x86 64 Montering: til 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-bit x86 64 Montering: til 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
På Windows kan et program afslutte sig selv ved at ringe til ExitProcess eller RtlExitUserProcess-funktionen.
Se også
|
|
Referencer
eksterne links
- Den eneste UNIX-specifikation , udgave 7 fra The Open Group : afslut en proces - Systemgrænsefladesreference,
- C ++ reference for
std::exit