使用 C 語言的 exit 函式

Jinku Hu 2023年1月30日 2021年2月28日
  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);
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

相關文章 - C Process