C++ 中的退出(1)

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

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

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

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

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

#include <unistd.h>

#include <iostream>

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 <unistd.h>

#include <iostream>

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 <unistd.h>

#include <iostream>

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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook