시그널 핸들러

글쓴이: 익명 사용자 / 작성시간: 목, 2017/06/08 - 1:34오후
시그널 핸들러에서 다양한 기능을 하기 위해서 사용자 정의 다른 함수들을 호출했는데
계속 죽더라구요..
그래서 찾아보니 '시그널 처리부에 비지역적 분기를 수행하는 것을 고려할때 sigsetjmp, siglongjmp를 권장한다'
라는 글을 보고 시그널핸들러에는 siglognjmp를
그리고 호출하고 싶은 함수에는 sigsetjmp를 해놓았는데,
역시나... 되지 않습니다ㅜ
siglongjmp, sigsetjmp에 관한 코드들은 모두 main에서 sigsetjmp를 설정해놓았던데,
꼭 main에서 해야하나요?
혹은, 시그널핸들러에서 다른 함수를 호출하고 싶을때 처리할 수 있는 다른 방법이 있나요?
Forums:
...
일단 글을 쓰신 걸 봐선 (sig)longjmp/setjmp는 어떻게 쓰는지 잘 모르시는 것 같고요... 얘들은 일반적인 상식(?)을 뛰어넘는 행동을 하는 위험한 함수들이기 때문에 가급적 안 쓰는 게 좋습니다.
그리고 signal handler에서 사용해선 안되는 함수를 불러서 문제가 되는 경우라면 longjmp를 한다고 해결되지 않습니다. 어차피 안되는 건 마찬가집니다.
일반적으로 global 변수를 하나 둔 다음 signal handler에서는 그 변수에 "signal handler가 불렸음"만 기록해 놓고 원래 돌고 있던 함수에서 주기적으로 그 global 변수를 체크해서 필요한 동작을 하는 방법이 종종 쓰입니다. 아니면 별도의 thread를 만든 다음에 핸들러에서 그 thread에 신호를 보내서 깨워주는 방법이 있습니다. (물론 깨워줄 때도 시그널 핸들러에서 사용 가능한 함수를 이용해야 하기 때문에 아무렇게나 되지는 않습니다. write는 핸들러에서 부를 수 있기 때문에 미리 pipe를 만들어 놓고 다른 thread는 read로 기다리고 있고 핸들러는 write를 해서 깨워주는 방법이 가능합니다. 더 깔끔하고 모던한 방법도 있을 것 같은데 시그널을 안 건드려 본지 한 10년 돼서 더 이상은 잘 모르겠네요.)
댓글 달기