使用 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);
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