%20%EC%84%A4%EB%AA%85%20%ED%95%B4%EC%84%9D.png)
exit()
Open Group 기본 사양(다양한 문제)의 기능 설명 에서 다음을 읽었습니다.
이
exit()
함수는 먼저 atexit()에 등록된 모든 함수를 등록의 역순으로 호출해야 합니다.등록 시 호출된 이전에 등록된 함수 이후에 함수가 호출되지 않는 한.
확실히 내 잘못이지만 굵은 글씨를 이해할 수 없습니다(그리고 문법 구조도 인식할 수 없습니다!). 다른 사람에게 이 문장의 의미를 바꾸어 설명해 달라고 요청할 수 있나요? 예가 있을 수 있습니다.
답변1
사양의 이 부분은 다른 종료 처리기에서 등록된 함수를 다룹니다. 고려하다
#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
from main
및 func4
from func3
(이것은 호출된 첫 번째 핸들러이고 종료에 등록된 마지막 핸들러입니다 main
). 등록 func3
중에 이미 호출되었으므로 func4
더 이상 핸들러의 실행 순서에서 고려되지 않습니다.
$ make exit
cc exit.c -o exit
$ ./exit
func3
func4
func2
func1
강조 표시한 부분이 없으면 엄격한 해석에 따라 func4
이전에 호출해야 하거나 func3
(불가능) func3
이후에 호출해야 하거나(다시) func4
종료 처리가 시작되면 핸들러를 더 이상 등록할 수 없는 것으로 제안됩니다(실행을 보존하기 위해). 주문하다).
답변2
프로그램 호출
exit(3)
(또는 함수에서 반환main()
) 후 모든 함수는이미등록된 것은atexit(3)
등록의 역순으로 호출됩니다.하지만 등록된 함수
atexit(3)
(라고 부르자foo()
) 자체를 호출하여atexit(3)
등록 할 수 있습니다.다른 기능(bar()
)로 푸시됩니다.앞쪽목록에 있으며 바로 뒤에 호출됩니다foo()
.
등록되었음에도 불구하고 bar()
이후에도 계속 호출됩니다.foo()
뒤쪽에 foo()
이는 "모든 함수는 등록된 역순으로 호출된다"는 "규칙"에 대한 예외입니다.
도움이 되었기를 바랍니다.