문제

사이에 차이가 있나요?

   int on_exit(void (*function)(int , void *), void *arg);

그리고

   int atexit(void (*function)(void));

on_exit에서 사용하는 함수가 종료 상태를 얻는다는 사실 외에는 무엇입니까?

즉, 종료 상태에 관심이 없다면 둘 중 하나를 사용해야 할 이유가 있습니까?

편집하다: 많은 답변이 경고되었습니다. on_exit 비표준이기 때문이죠.기업 내부용으로 특정 구성에서 실행되도록 보장되는 앱을 개발하는 경우 이에 대해 걱정해야 합니까?

도움이 되었습니까?

해결책

에 따르면 이 링크 찾아보니 약간의 차이가 있는 것 같습니다. on_exit 에 전달된 인수를 전달할 수 있습니다. on_exit 함수가 호출될 때...종료해야 할 때 정리 작업을 수행하기 위한 몇 가지 포인터를 설정할 수 있습니다.

게다가, on_exit 모든 플랫폼에서 호환되지 않을 수 있는 SunOS 특정 기능이었습니다...따라서 더 제한적임에도 불구하고 atexit을 계속 사용하는 것이 좋습니다.

다른 팁

당신은 사용해야합니다 atexit() 가능하다면. on_exit() 비표준적이고 덜 일반적입니다.예를 들어 OS X에서는 사용할 수 없습니다.

Kernel.org - on_exit():

이 기능은 Sunos 4에서 나오지만 libc4, libc5 및 glibc에도 존재합니다.Solaris(SunOS 5)에서는 더 이상 이 문제가 발생하지 않습니다.이 기능을 피하고 대신 표준 ATEXIT (3)를 사용하십시오.

차이점은 atexit C이고 on_exit GNU와 다른 Unixy 시스템에서 사용할 수 있는 이상한 확장입니다(그러나 아니다 POSIX의 일부).

@Nathan, 현재 실행 중인 프로세스의 종료 코드를 반환하는 함수를 찾을 수 없습니다.아직 설정되지 않았을 것으로 예상됩니다. atexit() 어쨌든 호출됩니다.이는 런타임이 그것이 무엇인지 알고 있지만 아마도 이를 OS에 보고하지 않았다는 것을 의미합니다.하지만 이것은 거의 추측에 불과합니다.

당신이 사용해야 할 것 같습니다 on_exit() 또는 종료 코드가 중요하지 않도록 프로그램을 구성하십시오.주 함수의 마지막 문에서 전역 변수를 뒤집는 것은 무리가 아닙니다. exited_cleanly 변수를 true로 설정합니다.등록한 기능에서 atexit(), 이 변수를 확인하여 프로그램이 어떻게 종료되었는지 확인할 수 있습니다.이렇게 하면 두 가지 상태만 제공되지만 대부분의 요구 사항에는 충분할 것으로 예상됩니다.필요한 경우 더 많은 종료 상태를 지원하도록 이 유형의 구성표를 확장할 수도 있습니다.

@나단

먼저 종료 상태를 확인하는 또 다른 API 호출이 있는지 확인하세요.잠깐 훑어봐도 하나도 보이지 않습니다. 하지만 저는 표준 C API에 정통하지 않습니다.

쉬운 대안은 종료 상태를 저장하는 전역 변수를 갖는 것입니다.기본값은 알 수 없는 오류 원인입니다(프로그램이 비정상적으로 종료되는 경우).그런 다음 종료를 호출하면 종료 상태를 전역에 저장하고 모든 atexit 함수에서 검색할 수 있습니다.이렇게 하려면 모든 종료 호출 전에 종료 상태를 부지런히 저장해야 하며 분명히 이상적이지는 않지만 API가 없고 위험을 감수하고 싶지 않은 경우 on_exit 플랫폼에 있지 않아...그것이 유일한 선택일 수도 있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top