시그널이 블록된다는게 무슨뜻인가요?
인터럽트에 관해 공부하다보니.. 시그널 처리에 관해 나오는데요..
sa_mask 세팅에 관해 알아보다보니..시그널 블록이 어쩌고 나오는데,
시그널이 블록된다는게 무슨뜻인지 모르겠습니다.
다음과 같은 문장인데요..
"시그날 핸들러가 호출되었을 때, 당신은 보통 그 시그날 핸들러가 다른 시그날에 의해 블록됨이 없이 끝나기를 원한다. 그 핸들러가 시작된 순간부터 끝나는 순간까지, 당신은 핸들러의 데이터를 오염시키거나 혼란시킬지도 모르는 시그날을 블록해야만 한다.
한 시그날에 의해 핸들러 함수가 호출되었을 때, 핸들러가 실행되는 동안 그 시그날은 자동적으로 블록된다 ( 다른 시그날과 함께 그 시그날은 이미 프로세스의 시그날 마스크에 존재하게된다.) 만일 예를들어 당신이 SIGTSTP를 위한 핸들러를 준비했을때, 그 시그날이 도착하면 핸들러는 핸들러가 실행되는 동안 기다리도록 하여 나중에 SIGTSTP 시그날을 다시 발생시킨다."
시그날 핸들러가 다른 시그날에 의해 블록된다는게 무슨뜻인지..
A라는 시그날에 의해 핸들러가 호출되어 실행되는동안 B라는 시그날이 도착하면 핸들러의 호출을 방해하기라도 하는건가요? -.-a
시그널 마스크는 또 뭔지.. 갸웃갸웃..
스티븐 아저씨 책을 좀 뒤져봤는데 역시 이해하기가 힘드네요..
"Posix allows us to specify a set of signals that will be 'blocked' when our signal handler is called. Any signal that is blocked cannot be 'delivered' to the process. We set the sa_mask member to the empty set, which means that no additional signals are blocked while our signal handler is running. Posix guarantees that the signal being caught is always blocked while its handler is executing."
어떤 시그널을 받아서 시그널 핸들러가 수행되는동안 받을려고 하는 signal이 한개 더 도착하면.. 시그널 핸들러 수행되는동안 블럭(?-.-a)되어있다가 핸들러 수행이 끝나면 블럭되어있던 시그널에 의해 다시 핸들러가 또 호출되고.. 뭐 그런건지..(갸웃갸웃)
sa_mask를 empty set으로 세팅하면 관심없는 시그널들로 인해 시그널 핸들러의 실행이 방해받지 않는다는 건가요?(그럼 관심없는 시그널들은 다 무시되는거구 관심있는 시그널은 핸들러 실행을 기다렸다가 다시 호출하는건지..)
어떻게 이해해야하는것인지 모르겠습니다.. ㅠ.ㅠ
시그널이 블록된다.. ㅠ.ㅠ
답변 부탁드립니다.
정확히 모르지만..
시그널은 운영체제에서 프로세스로 전달하는 거잖아요..
프로세스가 시그널을 받으면 처리할 핸들러를 프로그램안에
정의해 놓게 됩니다..
그래서 시그널을 받게 되면 블로킹된다는 말은 시그널을 처리하는 핸들러가 동작을 완료하기 전에는 다른 시그널처리가 안된다고 하는것입니다.
lock을 걸어 놓은다고 해야할까요..
비슷한 뜻이죠
^^
Re: 시그널이 블록된다는게 무슨뜻인가요?
그럼 이 문장은 무슨뜻인가요..? 다른 시그널은 그냥 다 처리가 된다는 거고 핸들러로 처리하게끔 정의된 시그널만 블록된다는 의미인가요..?
ㅠ.ㅠ(에궁..)
간단하게 말해서 보호해주지 않는다는 것을 말할려는 거죠.
보통 emptyset 으로 가져가는 경우는 sigaction() 으로 등록된 핸들러가 작동될때 다른 시그널이 발생하면 바로 현재 시그널에 끼어들어버리게 됩니다. 즉 완벽한 핸들러의 수행종료를 보장할 수 없단 것이죠.
그래서 보통 어떤 값이 바뀌어서 완벽한 수행을 보장해야 하는 시그널핸들러는 fillset 으로 하고, 몇몇 바로 전달되어야 하는 시그널(TERM, INT ...)와 같은 경우만 sigdelset() 으로 빼준답니다.
========================================
* The truth will set you free.
Re: 간단하게 말해서 보호해주지 않는다는 것을 말할려는 거죠.
아.. 그렇군요.. ^^*
그런데.. 한가지..ㅜ.ㅜ 바로 전달되어야 하는 시그널에 관해서는 어디서 정보를 얻을수 있을까요?ㅠ.ㅠ(죄송..)
무시하면 안되는 시그널에 대해서.
일반적으로 프로그램의 영역을 깨버리는 에러는 무시하면 안되죠.
기본적으로 SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT등은 무시하거나 혹은 다른 핸들러로 교체하면 안됩니다. 이 외에 SIGTERM, SIGQUIT, SIGINT, SIGKILL과 같은 종료시그널도 마찬가지죠. 아 그런데 SIGTERM은 종종 dump나 현재 상태 기록을 위해서 다른 시그널로 바꾸기도 합니다. 하지만, 내부에서 꼭 exit()와 같이 프로세스 종료시점이 명시적으로 되어있어야 합니다. 자세한것은 아마 매뉴얼 페이지에 시그널블록에 대한 곳에 같이 설명이 나오지 않을까 싶네요.
아니면 glibc library reference를 보시기를 권장합니다.
========================================
* The truth will set you free.
감사합니다.
^^*정말 감사합니다.
(_ _)~꾸벅
댓글 달기