çıkış (sistem çağrısı) - exit (system call)

Birçok bilgisayar işletim sisteminde , bir bilgisayar işlemi , sistemden çıkış çağrısı yaparak yürütmesini sonlandırır . Daha genel olarak, çok iş parçacıklı bir ortamdan çıkış , yürütme iş parçacığının çalışmayı durdurduğu anlamına gelir . İçin kaynak yönetimi , işletim sistemi reclaims kaynakları ( bellek , dosya işlem tarafından kullanılan, vs.). Sürecin sona erdikten sonra ölü bir süreç olduğu söylenir .

Nasıl çalışır

Altında Unix ve Unix benzeri işletim sistemleri onun zaman, bir süreç başlatılır üst süreç bir yürüten çatal sistem çağrısı . Üst İşlem daha sonra olabilir beklemek için alt işlemi sonlandırma, ya da (muhtemelen diğer alt işlemler kapalı bölmek) yürütülmesine devam edebilir. Alt süreç, normal olarak exit çağrılarak veya önemli bir istisna veya sinyal (örneğin, SIGTERM , SIGINT , SIGKILL ) nedeniyle anormal bir şekilde sona erdiğinde ("öldü"), işletim sistemine bir çıkış durumu döndürülür ve bir SIGCHLD sinyali ana sürece gönderilir. Çıkış durumu daha sonra ana süreç tarafından bekleme sistem çağrısı yoluyla alınabilir .

Çoğu işletim sistemi, sonlandırma işleminin , ana sürece sağlanan sisteme belirli bir çıkış durumu sağlamasına izin verir . Bazı işletim sistemleri (örneğin, Bell Labs'den Plan 9 ) bir karakter dizisinin döndürülmesine izin verse de , tipik olarak bu bir tamsayı değeridir . Bir tamsayı değeri döndüren sistemler, başarılı yürütmeyi belirtmek için genellikle sıfır değerini ve hata koşullarını belirtmek için sıfır olmayan değerleri kullanır. Diğer sistemler (örneğin, OpenVMS ) başarı için çift sayılı değerler ve hatalar için tek değerler kullanır. Yine diğer sistemler (örneğin, IBM z/OS ve ondan öncekiler) başarı, uyarı ve hata tamamlama sonuçlarını belirtmek için tamsayı değer aralıklarını kullanır.

Temizlemek

Çıkış işlemi, denetimi işletim sistemine geri döndürmeden önce, genellikle işlem alanı içinde temizleme işlemlerini gerçekleştirir. Bazı sistemler ve programlama dilleri , süreç fiilen sona ermeden önce program sonlandırıldığında çağrılmaları için kullanıcı alt rutinlerinin kaydedilmesine izin verir . Sonlandırmanın son adımı olarak, işletim sistemine işlemin sona erdiğini bildiren ve işlem tarafından kullanılan kaynakları geri almasına izin veren ilkel bir sistem çıkış çağrısı çağrılır.

Olağan temizliği atlamak bazen mümkündür; C99_exit() , mevcut süreci herhangi bir ekstra program temizliği olmadan sonlandıran bir fonksiyon sunar . Bu, örneğin, çağrı alt sürecin yerini almadığında bir fork-exec rutininde kullanılabilir exec; çağırma atexitrutinleri hatalı olarak ebeveyne ait kaynakları serbest bırakır.

Yetimler ve zombiler

Bazı işletim sistemleri, üst süreci özel bir şekilde sonlandırılan bir alt süreci işler. Böyle bir yetim süreç , daha sonra alt sürecin sona ermesini bekleyen özel bir kök sürecin çocuğu olur . Benzer şekilde, sonlandırılmış ancak çıkış durumu üst süreç tarafından yok sayılan bir alt süreç olan bir zombi süreci ile başa çıkmak için benzer bir strateji kullanılır . Böyle bir süreç, çocuğun çıkış durumunu alan ve işletim sisteminin ölü sürecin sonlandırılmasını tamamlamasını sağlayan özel bir üst sürecin çocuğu olur. Bu özel durumlarla uğraşmak, sistem işlem tablosunu tutarlı bir durumda tutar .

Örnekler

Aşağıdaki programlar sonlandırır ve sisteme başarılı bir çıkış durumu döndürür .

C :
#include <stdlib.h>

int main(void)
{
    exit(EXIT_SUCCESS); /* or return EXIT_SUCCESS */
}
C++ :
#include <cstdlib>

int main()
{
    std::exit(EXIT_SUCCESS); // or return EXIT_SUCCESS
}

KOBOL :

 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);
    }
}

Paskal :

program wiki;
begin
        ExitCode := 0;
        exit
end.

PC DOS Toplu iş dosyası :

exit 0

Perl :

#!/usr/bin/env perl
exit;

PHP :

<?php
exit(0);

Python :

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

Unix kabuğu :

exit 0

PC DOS Montajı :

; 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

Bazı programcılar her şeyi INT 21h için bir kerede hazırlayabilir:

    MOV AX, 4C00h ; replace the 00 with your error code in HEX

Linux 32-bit x86 Montajı:

; 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 Montajı: FASM için

 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 Montajı: NASM için

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

pencereler

Windows'ta bir program ExitProcess veya RtlExitUserProcess işlevini çağırarak kendini sonlandırabilir.

Ayrıca bakınız

Referanslar

Dış bağlantılar