跳到內容

C 程式設計/stdlib.h/exit

來自華夏公益教科書,自由的教科書

在許多計算機作業系統中,計算機程序透過發出 **exit** 系統呼叫來終止其執行。更一般地,在多執行緒環境中,退出意味著執行執行緒已停止執行。作業系統會回收程序使用的資源(記憶體、檔案等)。該程序在終止後被稱為死亡程序

它是如何工作的

[編輯 | 編輯原始碼]

在 Unix 和類 Unix 作業系統中,當父程序執行 fork 系統呼叫時,程序啟動。父程序隨後可以等待子程序終止,或者可以繼續執行(可能派生出其他子程序)。當子程序終止(“死亡”)時,無論是透過呼叫 exit 正常終止,還是由於致命錯誤或訊號(例如,SIGTERM、SIGINT、SIGKILL)異常終止,都會將退出狀態返回給作業系統,並向父程序傳送 SIGCHLD 訊號。父程序隨後可以透過 wait 系統呼叫檢索退出狀態。

大多數作業系統允許終止程序向系統提供特定的退出狀態,該狀態可供父程序使用。通常,這是一個小的整數值,儘管某些作業系統(例如,Plan 9)允許指定一個字元字串。

退出操作通常在將控制權交回作業系統之前,在程序空間內執行清理操作。一些系統和程式語言允許使用者註冊子例程,以便在程式實際終止之前,在程式終止時呼叫這些子例程。作為終止的最後一步,將呼叫一個原始的系統退出呼叫,通知作業系統程序已終止,並允許其回收程序使用的資源。

有時可以繞過通常的清理;C99 提供了 _exit() 函式,它在沒有任何額外程式清理的情況下終止當前程序。例如,這可以在 fork-exec 例程中使用,此時 exec 呼叫未能替換子程序;呼叫 atexit 例程將錯誤地釋放屬於父程序的資源。

孤兒和殭屍

[編輯 | 編輯原始碼]

某些作業系統以特殊方式處理其父程序已終止的子程序。這種孤兒程序成為一個特殊的根程序的子程序,該程序隨後等待子程序終止。同樣,類似的策略用於處理殭屍程序,即已終止但其退出狀態被其父程序忽略的子程序。這種程序成為一個特殊父程序的子程序,該程序檢索子程序的退出狀態並允許作業系統完成死亡程序的終止。處理這些特殊情況可以使系統程序表保持一致的狀態。

以下程式終止並向系統返回成功的退出狀態。

C

#include <stdlib.h>

int main(void)
{
    exit(EXIT_SUCCESS);
}

或者

#include <stdlib.h>

int main(void)
{
    return EXIT_SUCCESS;
}

C++

#include <cstdlib>

int main(void)
{
    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.

Java

public class Success
{
    public static void main(String[] args)
    {
        System.exit(0);
    }
}

DOS 批處理檔案

exit 0

Perl

#!/bin/perl
exit;

PHP

<?php
exit(0);
?>

Python

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

Unix shell

exit 0

Pascal

program pr1;
begin
 exit(0);
end;

DOS 彙編

; 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

一些程式設計師可能會一次為 INT 21h 準備所有內容

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

Linux 彙編

; For NASM
MOV AL, 1 ; Function 1: exit()
MOV EBX, 0 ; Return code
INT 80h ; The only interrupt Linux uses!
# For GAS
.text

.globl _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

  • SIGCHLD
  • 執行緒
[編輯 | 編輯原始碼]
華夏公益教科書