[완료] C/C++ 프로세스의 비정상 종료시에도 atexit 비슷하게 처리를 해줄 수 있는 방법이 있을까요?

bsakiag의 이미지

안녕하세요?

C/C++ 에서는 정상 종료일 경우, atexit()로 종료처리 함수를 등록하고 사용할 수 있습니다.
이게 비정상 종료일 경우에는 해당되지 않지요.
만일 외부의 시그널에 의해 비정상 종료될 경우, 그리고 그 signal이 catch 할 수 없는 SIGKILL일
경우에도 atexit()의 등록함수 처럼 어떤 종료함수를 호출하고 싶을때는 어떻게 해야 하나요?

쉽게 말해 어떻게 죽든 (h/w fault가 아닌이상..) alloc/new 한 메모리는 free/delete하고 싶어서 입니다.

또하나..
외부의 명령에의해 프로세스가 죽긴하는데, signal 로는 잡히질 않습니다.
그래서 저는 SIGKILL로 추측하고 있습니다만..
SIGKILL이라는것을 확인할 수 있는 방법은 없는지..
(SIGKILL에 대한 시그널 핸들러를 수행하진 못해도, 최소한 SIGKILL을 받았다는 것을 알수는 없을까요?)

고수님들의 명쾌한 설명을 바랍니다.
이만.

jick의 이미지

SIGKILL은 프로세스가 완전히 맛이 가서 무슨 짓을 할지 모르는 상황에서도 무조건 죽일 수 있는 목적으로 만든 절대지존 시그널이기 때문에 받는 쪽에서 아무 것도 할 수 없습니다.

그리고 어떤 상황에서도 free/delete... 으음...... 얼마전에 한바탕 flamewar를 벌였던 안좋은 기억이 떠오르는데 -_- 짧게 말씀드리자면, 프로세스가 죽으면 어차피 메모리가 다 날아가기 때문에 걱정하지 않으셔도 됩니다.

참고로 말씀드리자면 SIGKILL이 아닌 다른 catch 가능한 시그널이라도 (SIGINT/SIGTERM/등등) 시그널 핸들러에서 free/delete하면 안됩니다. free는 signal safety를 보장하지 않기 때문에 무슨 일이 일어날지 장담할 수 없습니다.

다시 말해 SIGINT 등의 handler에서 아무 일도 하지 않고 exit를 부르는 프로그램은 정상적인 프로그램이지만, 그 안에서 free나 delete를 부르고 나서 exit를 부르는 프로그램은 잘못된 프로그램입니다. 시그널 핸들러에서 안심하고 부를 수 있는 함수의 종류는 대단히 제한되어 있습니다. (심지어 printf도 안됩니다.)

* 추가: 쓰고 나서 생각해 보니까 제가 C++을 잘 몰라서, delete 연산자의 경우에는 확실히 모르겠네요. free 함수는 안되는 게 확실합니다.

bsakiag의 이미지

자세하고 명쾌한 설명 감사드립니다.
덕분이 많이 배웠습니다.

그럼..이만..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.