쓰레드, 시그널

OS/리눅스 & 유닉스 2012. 2. 2. 09:13

1. signal handling in Multi-threaded applications

 

쓰레드 어플리케이션이 아닌경우 시그널 처리에는 3가지 방법이 있다.

1. 시그널에 대해 아무런 처리도 하지 않는다.(디폴트 액션을 취하겠다)

2. signal()을 이용해서 시그널 핸들러를 설정한다.

3. sigprockmask()와 sigaction()을 이용해서 특정시그널을 무시하거나, 시그널 핸들러를 설정해 준다.

 

3번을 강력히 추천!!

 

쓰레드 어플리케이션으로 gogo~

 

쓰레드와 시그널에 대한 질문 몇가지에 대한 답을 알아보면서 시작하자.

 

질문 1) 시그널이 어플리케이션으로 전달될 경우 어떤 하나의 쓰레드가 받나요? 아니면 모든 쓰레드가 받게되나요?

- 한개의 시그널은 오직 하나의 쓰레드로만 전달된다.

 

질문 2) 그럼 어떤 쓰레드가 시그널을 받게 되나요?

- 경우의 수는 2가지

    1. Synchronous signal - 시그널을 발생한 쓰레드에게로 간다.

    2. Asynchronous signal - 어떤 쓰레드에게나 갈 수 있다.즉, 랜덤하다는 이야기다.

  당연한 이야기다. 왜냐하면 Synchronous signal이라는건 프로그램의 액션에 의해 발생하는 시그널이고, 고로, 그 액션

  을 실행한 쓰레드에게 시그널이 가도록 되어있다. Asynchronous signal은 프로그램 독립적인 시그널이다. 예를 들면

  kill()을 이용해서 시그널을 프로세스에 보낼 경우가 해당된다. 고로, 어떤 쓰레드가 받을지는 예측 불허하다.

 

질문 3) 쓰레드는 부모의 signal mask값을 상속받을까요?

- 상속받는다. 예를 들면, 부모가 모든 시그널을 block 할 경우, 새롭게 생성되는 쓰레드는 모든 시그널이 block 되어있다.

 

쓰레드에서 시그널 처리를 위한 가장 좋은(개인적인..)모델은 모든 쓰레드에서 시그널을 block 하고, main thread만이 시그널을 처리하는 것이다.

 

void sighandle(void)

{

while (1)

{

sigwait(&sigset, &signum)

switch (signum)

{

case SIGXXX:

beak;

 

case SIGYYY:

break;

}

}

}

main()

{

/* 관심있는 시그널을 sigset에 등록하고 block */

sigaddset(&sigset, 시그널 1);

sigaddset(&sigset, 시그널 2);

 

pthread_sigmask(SIG_BLOCK, &sigset, NULL);

 

/* 이후 생성되는 모든 쓰레드는 관심 시그널이 block되어있으므로 main()에서만 sighandle()을 호출해서 관심

시그널을 처리한다 */

 

 

/* 쓰레드 생성 ... */

 

sighandle();

}

 

이런 흐름으로 code를 만들면 될 것 같다(개인적인 판단이다)

[출처] 쓰레드 #2|작성자 복스

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

gettimeofday  (0) 2012.02.04
쓰레드, 시그널2  (0) 2012.02.02
signal set 관련 함수 (sigemptyset, sigaddset, sigdelset, sigprocmask)  (0) 2012.02.01
pthread_kill  (0) 2012.02.01
시그널, signal  (0) 2012.02.01
: