[완료] C/C++ 프로세스의 비정상 종료시에도 atexit 비슷하게 처리를 해줄 수 있는 방법이 있을까요?
글쓴이: bsakiag / 작성시간: 월, 2008/03/24 - 11:08오전
안녕하세요?
C/C++ 에서는 정상 종료일 경우, atexit()로 종료처리 함수를 등록하고 사용할 수 있습니다.
이게 비정상 종료일 경우에는 해당되지 않지요.
만일 외부의 시그널에 의해 비정상 종료될 경우, 그리고 그 signal이 catch 할 수 없는 SIGKILL일
경우에도 atexit()의 등록함수 처럼 어떤 종료함수를 호출하고 싶을때는 어떻게 해야 하나요?
쉽게 말해 어떻게 죽든 (h/w fault가 아닌이상..) alloc/new 한 메모리는 free/delete하고 싶어서 입니다.
또하나..
외부의 명령에의해 프로세스가 죽긴하는데, signal 로는 잡히질 않습니다.
그래서 저는 SIGKILL로 추측하고 있습니다만..
SIGKILL이라는것을 확인할 수 있는 방법은 없는지..
(SIGKILL에 대한 시그널 핸들러를 수행하진 못해도, 최소한 SIGKILL을 받았다는 것을 알수는 없을까요?)
고수님들의 명쾌한 설명을 바랍니다.
이만.
Forums:
안됩니다.
SIGKILL은 프로세스가 완전히 맛이 가서 무슨 짓을 할지 모르는 상황에서도 무조건 죽일 수 있는 목적으로 만든 절대지존 시그널이기 때문에 받는 쪽에서 아무 것도 할 수 없습니다.
그리고 어떤 상황에서도 free/delete... 으음...... 얼마전에 한바탕 flamewar를 벌였던 안좋은 기억이 떠오르는데 -_- 짧게 말씀드리자면, 프로세스가 죽으면 어차피 메모리가 다 날아가기 때문에 걱정하지 않으셔도 됩니다.
참고로 말씀드리자면 SIGKILL이 아닌 다른 catch 가능한 시그널이라도 (SIGINT/SIGTERM/등등) 시그널 핸들러에서 free/delete하면 안됩니다. free는 signal safety를 보장하지 않기 때문에 무슨 일이 일어날지 장담할 수 없습니다.
다시 말해 SIGINT 등의 handler에서 아무 일도 하지 않고 exit를 부르는 프로그램은 정상적인 프로그램이지만, 그 안에서 free나 delete를 부르고 나서 exit를 부르는 프로그램은 잘못된 프로그램입니다. 시그널 핸들러에서 안심하고 부를 수 있는 함수의 종류는 대단히 제한되어 있습니다. (심지어 printf도 안됩니다.)
* 추가: 쓰고 나서 생각해 보니까 제가 C++을 잘 몰라서, delete 연산자의 경우에는 확실히 모르겠네요. free 함수는 안되는 게 확실합니다.
감사...
자세하고 명쾌한 설명 감사드립니다.
덕분이 많이 배웠습니다.
그럼..이만..
댓글 달기