Linux
解讀 Open Group Base Specification 對 exit() 的描述
在
exit()
Open Group Base Specifications(各種問題)的功能描述中,我們讀到:該
exit()
函式應首先呼叫 atexit() 註冊的所有函式,按註冊的相反順序呼叫,除非在註冊時已呼叫的任何先前註冊的函式之後呼叫該函式。這肯定是我的錯,但我無法理解(並且無法辨識語法結構!)粗體字的語句。我可以請人改寫並解釋這句話的含義嗎?可能舉個例子。
規範的那部分處理從另一個退出處理程序註冊的函式。考慮
#include <stdio.h> #include <stdlib.h> void func1(void) { puts("func1"); } void func2(void) { puts("func2"); } void func4(void); void func3(void) { atexit(func4); puts("func3"); } void func4(void) { puts("func4"); } int main(int argc, char **argv) { atexit(func1); atexit(func2); atexit(func3); }
這些函式按數字順序註冊:
func1
、func2
、func3
frommain
和func4
fromfunc3
(這是呼叫的第一個處理程序,main
退出時是最後一個註冊的處理程序)。因為在註冊func3
時已經被呼叫func4
,所以在handlers的執行順序中不再考慮:$ make exit cc exit.c -o exit $ ./exit func3 func4 func2 func1
如果沒有您突出顯示的部分,嚴格的解釋會建議
func4
應該在之前呼叫func3
(這是不可能的),或者func3
應該在之後(再次)呼叫func4
,或者一旦退出處理開始,處理程序就不能再註冊(以保留執行命令)。