C++ 中的退出(1)

Jinku Hu 2023年1月30日 2021年6月28日
  1. 使用 exit 函式終止帶有狀態碼的 C++ 程式
  2. 使用 exit(1) 終止帶有失敗狀態程式碼的 C++ 程式
C++ 中的退出(1)

本文將解釋如何在 C++ 中使用 exit() 函式。

使用 exit 函式終止帶有狀態碼的 C++ 程式

執行中的程式在作業系統中一般稱為程序,它有自己的生命週期,用不同的狀態來表示。有像 web 伺服器這樣的長時間執行的程式,但即使是那些需要在某些情況下或通過傳遞使用者訊號來終止的程式。程序終止可以使用 exit() 函式呼叫,它是 C 標準的一部分幷包含在 C++ 中。它需要一個整數引數來指定程式終止狀態,如果子程序被等待,可以從父程序讀取該狀態。

成功返回狀態碼的常規值為 0,除零之外的任何值都被視為錯誤程式碼,這可能對應於預定義的場景。請注意,有兩個巨集表示式分別稱為 EXIT_SUCCESSEXIT_FAILURE 來表示傳遞給 exit 呼叫的相應退出程式碼。通常,程式有多個檔案流和臨時檔案開啟,當呼叫 exit 時,它們會自動關閉或刪除。

#include <iostream>
#include <unistd.h>

using std::cout; using std::endl;

int main() {

    printf("Executing the program...\n");
    sleep(3);

    exit(0);
//    exit(EXIT_SUCCESS);
}

輸出:

Executing the program...

使用 exit(1) 終止帶有失敗狀態程式碼的 C++ 程式

引數值為 1exit 函式用於表示失敗終止。某些返回成功呼叫狀態程式碼值的函式可以與驗證返回值並在發生錯誤時退出程式的條件語句結合使用。請注意,exit(1) 與呼叫 exit(EXIT_FAILURE) 相同。

#include <iostream>
#include <unistd.h>

using std::cout; using std::endl;

int main() {

    if (getchar() == EOF) {
        perror("getline");
        exit(EXIT_FAILURE);
    }

    cout << "Executing the program..." << endl;
    sleep(3);

    exit(1);
    // exit(EXIT_SUCCESS);
}

輸出:

Executing the program...

exit() 函式的另一個有用功能是在程式最終終止之前執行專門註冊的函式。這些函式可以定義為常規函式,要在終止時呼叫,它們需要使用 atexit 函式註冊。atexit 是標準庫的一部分,以函式指標作為唯一引數。請注意,可以使用多個 atexit 呼叫註冊多個函式,並且一旦 exit 執行,它們中的每一個都會以相反的順序呼叫。

#include <iostream>
#include <unistd.h>

using std::cout; using std::endl;

static void at_exit_func()
{
    cout << "at_exit_func called" << endl;
}

static void at_exit_func2()
{
    cout << "at_exit_func called" << endl;
}

int main() {
    if (atexit(at_exit_func) != 0) {
        perror("atexit");
        exit(EXIT_FAILURE);
    }

    if (atexit(at_exit_func2) != 0) {
        perror("atexit");
        exit(EXIT_FAILURE);
    }

    cout << "Executing the program..." << endl;
    sleep(3);

    exit(EXIT_SUCCESS);
}

輸出:

Executing the program...
at_exit_func2 called
at_exit_func called
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn