sigprocmask 질문입니다.

미해결질문
ProgCoach4U 프로필
ProgCoach4U 3달 전

시그널은 시그널을 보내는 주체와 받는 주체가 있습니다. 시그널을 받는 주체 입장에서는 특정 시그널을 기다리는 상황에서 해당 시그널을 수신한다면 아무런 문제가 없겠죠.

시그널을 받지 말아야 하는 경우는 지속적으로 시그널을 블럭하는 경우와 일시적으로 시그널을 블럭하는 경우로 나눌 수 있겠네요. 예를 들어 Ctrl + C 입력(SIGINT)을 받아도 종료되지 않게 하는 경우에는 초기화 시 SIGINT를 무시하도록 처리하면 될 것입니다. 간단한 문제죠 :) 문제는 일시적으로 시그널을 블럭 해야하는 경우 입니다. 

어떤 시그널을 받으면 전역 변수를 변경해야 하는 코드가 있다고 하죠. 일반적으로는 잘 동작할 지 몰라도 main thread가 해당 전역 변수를 변경하고 있는 와중에 그 시그널이 도착해 시그널 핸들러가 동작했다고 하면.. 프로세스는 우리가 원치 않은 방향으로 진행될 수 있습니다. 이 때 필요한 것이 말씀하신 sigprocmask와 같은 API 입니다. 일종의 동기화를 하는 것이죠. 전역 변수를 건드리게 되는 main thread와 signal handler 간에 동기화를 해주기 위해 일시적으로 시그널의 처리를 막는 것입니다.

크리티컬 섹션에 동기화를 해주는 것은 단순히 코드를 막는 것이 아니라 데이터를 보호하는 것이라는 글귀가 생각나네요 :) 

문수미 프로필
문수미 3달 전

아하 그렇다면 sigprocmask API는 일시적으로 시그널의 처리를 막기 위해서 사용되는 것인가요? 예제에서는 SIGINT가 보내질 때마다 got sigterm을 출력하게 되어 있는데, 이 경우에 세번째 파라미터를 NULL값으로 주었기 때문인가요? 만약 세번재 파라미터에서 oldset을 받아온다면 기존 설정되어 있던 sigset으로 돌아갈 수 있겠지요. 이처럼 보통 일시적인 블록킹 처리 이후에 그 전 상태로 돌아가는 식으로 동작하나요?

ProgCoach4U 프로필
ProgCoach4U 3달 전

sigprocmask()가 항상 일시적인 처리만을 위해 사용되지는 않겠지만,  그렇게 자주 사용될 것 같습니다. 말씀하신대로 세번째 파라미터가 oldmask를 받아오기 위한 파라미터 입니다. oldmask를 받아서 저장하고 있다가 되돌리기 할 때 사용될 수 있습니다. 

제대로 이해하신 것 같아요~ :D

문수미 프로필
문수미 3달 전

넵 감사합니다~!

유영재 프로필
유영재 3달 전

선생님 signal block 동안 시그널 핸들러로 처리를 해주지 않으면 계속 시그널이 남아있게 되나요?