2010-03-09 4 views
0

동일한 프로세스 내의 다른 스레드에서 신호를 감지하는 스레드 실행을 시도 중입니다.신호 스레드 문제

sigset_t sigset; 
sigfillset(&sigset); 
pthread_sigmask(SIG_BLOCK, &sigset, &old); 

내가 이런 짓을하면, 나는 다음 과정을 디먼 화 : 이것은 다음과 같이 스레드 킥 오프 완료 "SignalHandler"라는 다른 클래스 내에서 이루어집니다

m_child = fork(); 
if (m_child == 0) 
{ 
    // Start the thread responsible for detecting a signal 
} 

:

m_pThread = new boost::thread(boost::bind(&SignalHandler::operator(), this)); 

다음과 같이 펑은 꽉 루프에서 작동합니다

while (1) 
{ 
    if (sigtimedwait(&sigset, &info, &ts) == -1) 
    { 
     if (errno == EAGAIN || errno == EINTR) 
     { 
      std::cout << "Time-out waiting for signal" << std::endl; 
     } 

     throw SystemError("sigtimedwait error"); 
    } 
    else 
    { 
     std::cout << "Detected a signal [" << info.si_signo << "]" << std::endl; 
    } 
} 

"kill -9 myProcess"를 실행하면 작동하지만 다른 스레드에서 불법적 인 포인터 조작을 실제로 수행하면 프로세스 코어가 덤프됩니다.

왜 하위 스레드에서 생성 된 신호가 내 신호 늘리기 스레드에서 발견되지 않습니까?

답변

2

아 - 알겠습니다.

문제

은 여기에서 : 동기 신호를 차단하는 것은 바람직하지 않은 효과를 유발하기 때문에 pthread_sigmask위한

sigset_t sigset; 
sigfillset(&sigset); 
pthread_sigmask(SIG_BLOCK, &sigset, &old); 

사용 sigfillset 위험하다. 신호가 킬() 함수에 의해 발생하지 않는 한 이들이 차단 동안 SIGFPE 중, SIGILL가 SIGSEGV가 또는 SIGBUS 신호가 생성되면

, 그 결과, 상기 sigqueue 정의되지() 함수 또는 raise() 함수를 호출합니다.