Open Group Base 사양의 exit() 설명 해석

Open Group Base 사양의 exit() 설명 해석

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, func3from mainfunc4from func3(이것은 호출된 첫 번째 핸들러이고 종료에 등록된 마지막 핸들러입니다 main). 등록 func3중에 이미 호출되었으므로 func4더 이상 핸들러의 실행 순서에서 고려되지 않습니다.

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

강조 표시한 부분이 없으면 엄격한 해석에 따라 func4이전에 호출해야 하거나 func3(불가능) func3이후에 호출해야 하거나(다시) func4종료 처리가 시작되면 핸들러를 더 이상 등록할 수 없는 것으로 제안됩니다(실행을 보존하기 위해). 주문하다).

답변2

  1. 프로그램 호출 exit(3)(또는 함수에서 반환 main()) 후 모든 함수는이미등록된 것은 atexit(3)등록의 역순으로 호출됩니다.

  2. 하지만 등록된 함수 atexit(3)(라고 부르자 foo()) 자체를 호출하여 atexit(3)등록 할 수 있습니다.다른 기능( bar())로 푸시됩니다.앞쪽목록에 있으며 바로 뒤에 호출됩니다 foo().

등록되었음에도 불구하고 bar()이후에도 계속 호출됩니다.foo()뒤쪽에 foo()이는 "모든 함수는 등록된 역순으로 호출된다"는 "규칙"에 대한 예외입니다.

도움이 되었기를 바랍니다.

관련 정보