시그널 핸들러

익명 사용자의 이미지

시그널 핸들러에서 다양한 기능을 하기 위해서 사용자 정의 다른 함수들을 호출했는데
계속 죽더라구요..
그래서 찾아보니 '시그널 처리부에 비지역적 분기를 수행하는 것을 고려할때 sigsetjmp, siglongjmp를 권장한다'
라는 글을 보고 시그널핸들러에는 siglognjmp를
그리고 호출하고 싶은 함수에는 sigsetjmp를 해놓았는데,
역시나... 되지 않습니다ㅜ
siglongjmp, sigsetjmp에 관한 코드들은 모두 main에서 sigsetjmp를 설정해놓았던데,
꼭 main에서 해야하나요?

혹은, 시그널핸들러에서 다른 함수를 호출하고 싶을때 처리할 수 있는 다른 방법이 있나요?

jick의 이미지

일단 글을 쓰신 걸 봐선 (sig)longjmp/setjmp는 어떻게 쓰는지 잘 모르시는 것 같고요... 얘들은 일반적인 상식(?)을 뛰어넘는 행동을 하는 위험한 함수들이기 때문에 가급적 안 쓰는 게 좋습니다.

그리고 signal handler에서 사용해선 안되는 함수를 불러서 문제가 되는 경우라면 longjmp를 한다고 해결되지 않습니다. 어차피 안되는 건 마찬가집니다.

일반적으로 global 변수를 하나 둔 다음 signal handler에서는 그 변수에 "signal handler가 불렸음"만 기록해 놓고 원래 돌고 있던 함수에서 주기적으로 그 global 변수를 체크해서 필요한 동작을 하는 방법이 종종 쓰입니다. 아니면 별도의 thread를 만든 다음에 핸들러에서 그 thread에 신호를 보내서 깨워주는 방법이 있습니다. (물론 깨워줄 때도 시그널 핸들러에서 사용 가능한 함수를 이용해야 하기 때문에 아무렇게나 되지는 않습니다. write는 핸들러에서 부를 수 있기 때문에 미리 pipe를 만들어 놓고 다른 thread는 read로 기다리고 있고 핸들러는 write를 해서 깨워주는 방법이 가능합니다. 더 깔끔하고 모던한 방법도 있을 것 같은데 시그널을 안 건드려 본지 한 10년 돼서 더 이상은 잘 모르겠네요.)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.