ออก (เรียกระบบ)

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

ใน ระบบปฏิบัติการคอมพิวเตอร์จำนวนมากกระบวนการของคอมพิวเตอร์จะยุติการดำเนินการโดยการเรียกออกจาก ระบบ โดยทั่วไป การออกใน สภาพแวดล้อม แบบมัลติเธรดหมายความว่าเธรดของการดำเนินการหยุดทำงาน สำหรับการจัดการทรัพยากรระบบปฏิบัติการจะเรียกคืนทรัพยากร ( หน่วย ความจำไฟล์ฯลฯ) ที่ใช้โดยกระบวนการ กระบวนการนี้เรียกว่าเป็นกระบวนการที่ตายแล้วหลังจากสิ้นสุด

มันทำงานอย่างไร

ภายใต้ ระบบ ปฏิบัติการที่คล้ายUnixและ Unix กระบวนการจะเริ่มขึ้นเมื่อกระบวนการหลักดำเนินการเรียกระบบfork กระบวนการหลักอาจรอให้กระบวนการลูกสิ้นสุด หรืออาจดำเนินการต่อไป (อาจแยกกระบวนการลูกอื่นออก) เมื่อกระบวนการลูกสิ้นสุดลง ("ตาย") ทั้งโดยปกติโดยการเรียกexitหรือผิดปกติเนื่องจากข้อยกเว้นร้ายแรงหรือสัญญาณ (เช่นSIGTERM , SIGINT , SIGKILL ) สถานะการออก ถูกส่งกลับไปยังระบบปฏิบัติการและ สัญญาณ SIGCHLDจะถูกส่งไปยังกระบวนการหลัก กระบวนการหลักสามารถเรียกสถานะออกได้ผ่านการเรียกระบบ รอ

ระบบปฏิบัติการส่วนใหญ่ยอมให้กระบวนการยุติเพื่อให้สถานะการออก เฉพาะ กับระบบ ซึ่งพร้อมใช้งานสำหรับกระบวนการหลัก โดยทั่วไป ค่านี้เป็นค่าจำนวนเต็ม แม้ว่าระบบปฏิบัติการบางระบบ (เช่นPlan 9 จาก Bell Labs ) อนุญาตให้ส่งคืนสตริงอักขระ ระบบที่คืนค่าจำนวนเต็มมักใช้ค่าศูนย์เพื่อระบุการดำเนินการที่สำเร็จ และค่าที่ไม่ใช่ศูนย์เพื่อระบุเงื่อนไขข้อผิดพลาด ระบบอื่นๆ (เช่นOpenVMS ) ใช้ค่าที่เป็นเลขคู่เพื่อความสำเร็จ และค่าคี่สำหรับข้อผิดพลาด ยังมีระบบอื่นๆ (เช่น IBM z/OSและรุ่นก่อน) ใช้ช่วงของค่าจำนวนเต็มเพื่อระบุผลลัพธ์ความสำเร็จ คำเตือน และข้อผิดพลาดที่เสร็จสมบูรณ์

ทำความสะอาด

การดำเนินการออกโดยทั่วไปจะดำเนินการล้างข้อมูลภายในพื้นที่กระบวนการก่อนที่จะคืนการควบคุมกลับไปยังระบบปฏิบัติการ ระบบและ ภาษาการเขียนโปรแกรมบางระบบอนุญาตให้ ลงทะเบียน รูทีนย่อย ของผู้ใช้ เพื่อให้เรียกใช้เมื่อสิ้นสุดโปรแกรมก่อนที่กระบวนการจะยุติลงอย่างแท้จริง ในขั้นสุดท้ายของการยกเลิก ระบบจะเรียกใช้การเรียกออกจากระบบดั้งเดิมเพื่อแจ้งระบบปฏิบัติการว่ากระบวนการได้ยุติลงแล้ว และอนุญาตให้เรียกคืนทรัพยากรที่ใช้โดยกระบวนการได้

บางครั้งสามารถเลี่ยงการล้างข้อมูลตามปกติได้ C99มี_exit()ฟังก์ชันที่ยุติกระบวนการปัจจุบันโดยไม่ต้องล้างโปรแกรมเพิ่มเติม ซึ่งอาจใช้ ตัวอย่างเช่น ใน รูที น fork-execเมื่อการexecเรียกล้มเหลวในการแทนที่โปรเซสลูก รูทีน การเรียกatexitจะปล่อยทรัพยากรที่เป็นของพาเรนต์อย่างไม่ถูกต้อง

เด็กกำพร้าและซอมบี้

ระบบปฏิบัติการบางระบบจัดการกับกระบวนการย่อยที่กระบวนการหลักได้สิ้นสุดลงในลักษณะพิเศษ กระบวนการเด็กกำพร้าดังกล่าวจะกลายเป็นลูกของกระบวนการรูทพิเศษ ซึ่งจะรอให้กระบวนการย่อยสิ้นสุดลง ในทำนองเดียวกัน กลยุทธ์ที่คล้ายคลึงกันถูกใช้เพื่อจัดการกับzombie processซึ่งเป็นกระบวนการย่อยที่สิ้นสุดลงแล้ว แต่สถานะการออกจะถูกละเลยโดยกระบวนการหลัก กระบวนการดังกล่าวจะกลายเป็นกระบวนการย่อยของกระบวนการหลักพิเศษ ซึ่งดึงสถานะการออกของเด็กและอนุญาตให้ระบบปฏิบัติการสิ้นสุดกระบวนการที่ตายแล้ว การจัดการกับกรณีพิเศษเหล่านี้จะทำให้ตารางกระบวนการ ของระบบ อยู่ในสถานะที่สอดคล้องกัน

ตัวอย่าง

โปรแกรมต่อไปนี้จะยุติและส่งคืนสถานะการออกจากระบบสำเร็จ

:
#include <stdlib.h> 

int หลัก( เป็นโมฆะ) 
{
    ทางออก( EXIT_SUCCESS ); /* หรือกลับ EXIT_SUCCESS */ 
}
ค ++ :
#include <cstdlib> 

int หลัก() 
{
    std :: ทางออก( EXIT_SUCCESS ); // หรือกลับ EXIT_SUCCESS } 

โคบอล :

  กองระบุ. 
 รหัสโปรแกรม  ความสำเร็จ-โปรแกรม.
 
 กอง กระบวนการ. 
 หลัก_ 
     ย้าย ศูนย์ เพื่อ คืนรหัส จบโปรแกรม_
  

ฟอร์ทราน :

 โปรแกรมwiki 
      โทรออก( 0 ) 
 สิ้นสุดโปรแกรมwiki

จาวา :

 ความสำเร็จ ใน คลาส สาธารณะ{ public static void main ( สตริง[] args ) { ระบบ. ทางออก( 0 ); } }

        
    
        
    

ปาสกาล :

โปรแกรม วิกิ; 
เริ่ม
        ExitCode  :=  0 ; 
        ทางออก
สิ้นสุด_

ไฟล์แบ ตช์ DR-DOS : [1]

ทางออก 0

ภาษาเพิร์ล :

#!/usr/bin/env perl 
exit ;

PHP :

<?php 
ออก( 0 );

หลาม :

#!/usr/bin/env python3 
นำ เข้าsys 
sys ทางออก( 0 )

ยูนิกซ์เชลล์ :

ทางออก 0

การประกอบดอส :

; สำหรับMASM / TASM
.รุ่นเล็ก
.ซ้อนกัน
.รหัส
หลัก PROC ใกล้
    MOV AH, 4Ch ; บริการ 4Ch - ยุติด้วยรหัสข้อผิดพลาด 
    MOV AL, 0 ; รหัสข้อผิดพลาด
    INT 21h  ; ขัดจังหวะ 21 ชม. - DOS ขัดจังหวะทั่วไป
ENDP หลัก
END หลัก ; เริ่มต้นที่หลัก

โปรแกรมเมอร์บางคนอาจเตรียมทุกอย่างสำหรับ INT 21h พร้อมกัน:

    MOV ขวาน, 4C00h ; แทนที่ 00 ด้วยรหัสข้อผิดพลาดของคุณใน HEX

ลินุกซ์ 32 บิตx86แอสเซมบลี:

; สำหรับNASM
MOV อัล 1 ; ฟังก์ชัน 1: ออก ()
MOV EBX, 0 ; โค้ดส่งคืน
INT 80h  ; # ผ่านการควบคุมเพื่อขัดจังหวะเวกเตอร์
               # เรียกใช้การเรียกระบบ — ในกรณีนี้การเรียกระบบ
              # หมายเลข 1 พร้อมอาร์กิวเมนต์ 0
# สำหรับGAS
.ข้อความ

.global _start

_เริ่ม:
    movl $1, %eax   # หมายเลขการเรียกของระบบ 1: exit() 
    movl $0, %ebx   # ออกด้วยสถานะการออก 0 
    int $0x80       # ผ่านการควบคุมไปยังเวกเตอร์ขัดจังหวะ
                    # เรียกใช้การเรียกระบบ — ในกรณีนี้ การเรียกระบบ
                   # หมายเลข 1 พร้อมอาร์กิวเมนต์ 0

ชุดประกอบ Linux 64 บิตx86 64 : สำหรับFASM

 รูปแบบ ELF64  ปฏิบัติการ ได้  3
 
  เริ่มรายการ
 
 ส่วนปฏิบัติการ ที่ อ่านได้ 
 
 เริ่ม: 
     ; สิ่ง
     ; ออกจาก
     mov  eax ,  60   ; sys_exit หมายเลข syscall: 60 
     xor  edi ,  edi  ; ตั้งค่าสถานะการออกเป็น 0 (`xor edi, edi` เท่ากับ `mov edi, 0` ) 
     syscall       ; เรียกมันว่า

OS X 64 บิตx86 64แอสเซมบลี: สำหรับNASM

 
ทั่วโลก_main

ส่วน.text

_main: 
     mov  rax ,  0x02000001      ; sys_exit หมายเลข syscall: 1 (เพิ่ม 0x02000000 สำหรับ OS X) 
     xor  rdi ,  rdi             ; ตั้งค่าสถานะการออกเป็น 0 (`xor rdi, rdi` เท่ากับ `mov rdi, 0` ) 
     syscall 			     ; โทรออก ()

วินโดว์

บน Windows โปรแกรมสามารถยุติการทำงานเองได้โดยการเรียกฟังก์ชัน ExitProcess หรือ RtlExitUserProcess

ดูเพิ่มเติม

อ้างอิง

  1. ^ พอล, Matthias R. (1997-07-30) [1994-05-01]. "II.4 Undokumentierte Eigenschaften ภายนอก Kommandos" NWDOS-TIPs — Tips & Tricks rund um Novell DOS 7, กับ Blick auf undokumentierte Details, ข้อบกพร่องและวิธีแก้ปัญหา MPDOSTIP . รีลีส 157 (ในภาษาเยอรมัน) (ฉบับที่ 3) เก็บถาวรจากต้นฉบับเมื่อ 2016-11-05 . สืบค้นเมื่อ2012-01-11 .(หมายเหตุNWDOSTIP.TXTเป็นงานที่ครอบคลุมบนNovell DOS 7และOpenDOS 7.01ซึ่งรวมถึงคำอธิบายของคุณลักษณะและการทำงานภายในที่ไม่มีเอกสารจำนวนมาก ซึ่งเป็นส่วนหนึ่งของคอลเล็กชันของผู้เขียนแต่มีขนาดใหญ่กว่าMPDOSTIP.ZIPที่ได้รับการบำรุงรักษาจนถึงปี 2544 และเผยแพร่ในหลายไซต์ในขณะนั้น ลิงก์ที่ให้ไว้ ชี้ไปที่ไฟล์รุ่นเก่าที่แปลงเป็น HTML) [1]

ลิงค์ภายนอก