使用 C 語言的 exit 函式

Jinku Hu 2023年10月12日
  1. 使用 exit 函式終止 C 語言中的程序
  2. 使用 atexit 函式在 C 語言中註冊退出處理程式
使用 C 語言的 exit 函式

本文將演示如何使用 C 語言中的 exit 函式的多種方法。

使用 exit 函式終止 C 語言中的程序

當給定的程式在基於 UNIX 的作業系統上執行時,它被稱為一個程序。程序可能是一個長期執行的守護程序式的程式,也可能是一個簡單的命令列實用程式,但最終,它們都會在某個時間來到終止點。終止可以是由某些故障/訊號引起的非正常終止,也可以是程序本身通過呼叫 exit 庫函式作為正常行為優雅地終止。它需要一個單整數引數,指定返回給父程序的終止值。注意,exit 函式在呼叫程序中不返回。

exit 函式是建立在系統呼叫 _exit 之上的標準庫函式(我們將在接下來的段落中討論)。不過,它進行的操作還是比較多的,不僅僅是把呼叫者引到終止點。也就是說,exit 會對程式進行一些清理程式,比如註冊為退出處理程式的函式被呼叫,標準 I/O 流緩衝區被重新整理,然後才呼叫 _exit。要知道,_exit 是 UNIX 特有的系統呼叫,而 exit 是標準 C 庫的一部分,可以在不同平臺上利用。

下面的例子演示了使用 EXIT_SUCCESS 狀態引數呼叫 exit 函式,這個引數是一個巨集常量,值為 0,通常表示成功返回。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  // Execute program code here

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

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

輸出:

Executing the program...

使用 atexit 函式在 C 語言中註冊退出處理程式

atexit 函式用於註冊退出處理程式,這些程式只是使用者實現的函式,當使用 exit 呼叫終止程序時,應該被呼叫。atexit 把型別為 void (*function)(void) 的函式指標作為唯一的引數。

請注意,多個 atexit 呼叫可以註冊多個函式,這導致給定的函式按註冊的相反順序執行。如果呼叫失敗,atexit 會返回一個非零值。注意,如果程序被外部訊號異常終止,註冊的函式可能不會被呼叫。下一個示例程式碼實現了兩個 static 函式被註冊為退出處理程式,在 5 秒的睡眠後,程序用 exit 呼叫終止。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void atexitFunc(void) { printf("atexitFunc called\n"); }

static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }

int main(int argc, char *argv[]) {
  if (atexit(atexitFunc) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

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

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

  exit(EXIT_SUCCESS);
}

輸出:

Executing the program...
atexitFunc2 called
atexitFunc called

注意 atexitFunc2 首先被呼叫,然後是 atexitFunc。另外,這個程式也可以直接呼叫 _exit 系統呼叫來終止,這樣可以立即終止程序。不過要注意,它不會呼叫用 atexit 註冊的函式。相反,_exit 會關閉開啟的檔案描述符,這會在程序終止前造成未知的延遲。此外,我們可以使用帶有所需狀態值的 return 語句來引起類似 exit 函式提供的終止行為。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void atexitFunc(void) { printf("atexitFunc called\n"); }

static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }

int main(int argc, char *argv[]) {
  if (atexit(atexitFunc) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

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

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

  _exit(EXIT_SUCCESS);
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相關文章 - C Process