Linux

解讀 Open Group Base Specification 對 exit() 的描述

  • August 19, 2021

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);
}

這些函式按數字順序註冊:func1func2func3frommainfunc4from func3(這是呼叫的第一個處理程序,main退出時是最後一個註冊的處理程序)。因為在註冊func3時已經被呼叫func4,所以在handlers的執行順序中不再考慮:

$ make exit
cc exit.c -o exit
$ ./exit
func3
func4
func2
func1

如果沒有您突出顯示的部分,嚴格的解釋會建議func4應該在之前呼叫func3(這是不可能的),或者func3應該在之後(再次)呼叫func4,或者一旦退出處理開始,處理程序就不能再註冊(以保留執行命令)。

引用自:https://unix.stackexchange.com/questions/663989