beenden (Systemaufruf) - exit (system call)
Auf vielen Computerbetriebssysteme , ein Computerprozeß beendet seine Ausführung durch einen machen Austrittssystemaufruf . Mehr ein Ausgang in einer im allgemeinen, Multithreading - Umgebung bedeutet , dass ein Thread der Ausführung mehr lief. Für die Ressourcenverwaltung fordert das Betriebssystem Ressourcen ( Speicher , Dateien usw.) zurück, die vom Prozess verwendet wurden. Der Prozess wird als toter Prozess bezeichnet, nachdem er beendet wurde.
Wie es funktioniert
Unter Unix und Unix-ähnlichen Betriebssystemen wird ein Prozess gestartet, wenn sein Elternprozess einen Fork- Systemaufruf ausführt . Der Elternprozess kann dann auf die Beendigung des Kindprozesses warten oder die Ausführung fortsetzen (möglicherweise andere Kindprozesse abspalten). Wenn der Kindprozess beendet ("stirbt"), entweder normalerweise durch Aufrufen von exit oder abnormal aufgrund einer schwerwiegenden Ausnahme oder eines Signals (zB SIGTERM , SIGINT , SIGKILL ), wird ein Exit-Status an das Betriebssystem zurückgegeben und ein SIGCHLD- Signal ist an den übergeordneten Prozess gesendet. Der Exit-Status kann dann vom Elternprozess über den Wait- Systemaufruf abgerufen werden .
Die meisten Betriebssysteme erlauben dem beendenden Prozess, dem System einen bestimmten Exit-Status zu geben, der dem Elternprozess zur Verfügung gestellt wird. Normalerweise ist dies ein ganzzahliger Wert, obwohl einige Betriebssysteme (z. B. Plan 9 von Bell Labs ) die Rückgabe einer Zeichenkette zulassen . Systeme, die einen ganzzahligen Wert zurückgeben, verwenden im Allgemeinen einen Nullwert, um eine erfolgreiche Ausführung anzuzeigen, und Werte ungleich Null, um Fehlerbedingungen anzuzeigen. Andere Systeme (zB OpenVMS ) verwenden geradzahlige Werte für den Erfolg und ungerade Werte für Fehler. Wieder andere Systeme (z. B. IBM z/OS und seine Vorgänger) verwenden Bereiche von ganzzahligen Werten, um Erfolgs-, Warnungs- und Fehlerabschlussergebnisse anzuzeigen.
Aufräumen
Die Exit-Operation führt typischerweise Bereinigungsoperationen innerhalb des Prozessraums durch, bevor die Steuerung wieder an das Betriebssystem zurückgegeben wird. Einige Systeme und Programmiersprachen ermöglichen Benutzer - Subroutinen registriert werden , so dass sie bei Beendigung des Programms aufgerufen werden , bevor der Prozess beendet eigentlich für gut. Als letzter Schritt der Beendigung wird ein primitiver Systemexit-Aufruf aufgerufen, der das Betriebssystem darüber informiert, dass der Prozess beendet wurde, und es ihm ermöglicht, die vom Prozess verwendeten Ressourcen zurückzufordern.
Manchmal ist es möglich, die übliche Bereinigung zu umgehen; C99 bietet die _exit()
Funktion, den aktuellen Prozess ohne zusätzliche Programmbereinigung zu beenden. Dies kann beispielsweise in einer fork-exec- Routine verwendet werden, wenn der exec
Aufruf den Kindprozess nicht ersetzt; Aufruf atexit
Routinen würden Ressourcen fälschlicherweise freigeben an die Mutter gehören.
Waisen und Zombies
Einige Betriebssysteme handhaben einen Kindprozess, dessen Elternprozess auf besondere Weise beendet wurde. Ein solcher verwaister Prozess wird ein Kind eines speziellen Root-Prozesses , der dann auf die Beendigung des Kindprozesses wartet. Ebenso wird eine ähnliche Strategie verwendet, um mit einem Zombie-Prozess umzugehen , bei dem es sich um einen Kindprozess handelt, der beendet wurde, dessen Beendigungsstatus jedoch von seinem Elternprozess ignoriert wird. Ein solcher Prozess wird zum Kind eines speziellen Elternprozesses, der den Exit-Status des Kinds abruft und es dem Betriebssystem ermöglicht, die Beendigung des toten Prozesses abzuschließen. Der Umgang mit diesen speziellen Fällen hält das System Prozesstabelle in einem konsistenten Zustand.
Beispiele
Die folgenden Programme werden beendet und geben einen erfolgreichen Exit-Status an das System zurück.
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
Manche Programmierer bereiten vielleicht alles auf einmal für INT 21h vor:
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 Assembly: für 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- Assembly: für 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()
Fenster
Unter Windows kann sich ein Programm durch Aufrufen der Funktion ExitProcess oder RtlExitUserProcess selbst beenden.
Siehe auch
|
|
Verweise
Externe Links
- The Single UNIX Specification , Issue 7 von The Open Group : einen Prozess beenden – System Interfaces Reference,
- C++-Referenz für
std::exit