çı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 atexit
rutinleri 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 :
|
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.
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
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
; 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
- Tek UNIX Spesifikasyonu , Açık Gruptan Sayı 7 : bir işlemi sonlandır – Sistem Arayüzleri Referansı,
- için C++ referansı
std::exit