2014-12-01 3 views
5

나는 sigaddset과 sigaction을 사용하는이 코드를 가지고있다. 그러나 segaddset에 대한 의견이 있으면 결과는 동일합니다.sigaddset은 무엇을 위해 사용됩니까?

struct sigaction act; 

    act.sa_handler = process_alarm; 
    act.sa_flags = 0;   
    sigemptyset(&act.sa_mask); 
    //sigaddset(&act.sa_mask, SIGINT); 

    sigaction(SIGALRM, &act, NULL); 

    for(;;) 
    { 
     alarm(3); 
     pause(); 
    } 

왜 사용해야합니까?

+1

'sigaddset()'을 주석 처리하거나 주석 처리하지 않고 프로그램을 실행할 때'CTRL + C'를 눌러 보셨습니까? –

+0

@SouravGhosh 예 그러나 다른 답변에서 지적한 바와 같이 알람 처리기는 그 영향을 신속하게 파악하기 위해 실행됩니다. 핸들러에서'sleep (10)'을 추가하면 그 차이를 볼 수 있습니다 :) – NeDark

답변

12
당신이 여기 가지 일을

하십시오 sigset_t 채우기

  1. 합니다. sigset_t는 단지 시그널 값들의 집합이며, 다양한 시스템 호출에 사용된다. 당신은 할 수 있습니다 세트에 신호를 추가

    • 빈 sigset_t 만들기 (하는데 sigemptyset()을 (sigaddset())
    • 이 설정에 신호를 제거 (sigdelset())
    • 등 ..
  2. 신호 처리기의 신호 마스크 설정.sigaction() 호출을 사용하여 신호 처리기를 설정할 때 struct sigaction 구성원을 조작하면됩니다. 즉, 이들 신호만큼 그들은 차단로서 취급되지 않는다 -

신호 처리기의 신호 마스크는 신호 처리기가 실행되는 동안, 마스크에있는 신호들이 차단된다는 것을 의미한다. 신호 처리기가 끝나면 신호는 차단 해제됩니다. 차단 된 신호는 "손실"되지 않으며 특정 신호가 다시 차단 해제 될 때 처리됩니다.

sigaddset(&act.sa_mask, SIGINT);SIGALRM 처리기 코드가 실행되는 동안 SIGINT 신호가 발생하지 않음을 의미합니다.

반면에 sigaddset(&act.sa_mask, SIGINT);을 주석 처리하면 sigemptyset(&act.sa_mask);으로 생성 된 신호의 빈 목록 만 남게됩니다. 따라서 SIGALRM 핸들러 기능이 실행 중일 때 발생하는 모든 신호는 해당 핸들러를 선점하고 그 다른 신호에 대한 신호 핸들러를 실행할 수 있습니다.

SIGINT의 경우 일반적으로 SIGALRM에 대한 처리기가 실행 중일 때 CTRL-C를 정확하게 관리 할 가능성이 거의 없으며 SIGALRM 처리기가 눈에 띄지 않을 정도로 신속하게 실행됩니다 SIGINT가 약간 지연되면.

0

sigaddset은 해당 신호 마스크를 해당 sigset_t 변수에 추가하는 데 사용됩니다.

sigaction에서는 필수 사항이 아닙니다. 이 변수에서 언급 한 신호를 차단하기위한 sigprocmask를 사용할 때이를 사용할 수 있습니다.

5

신호 세트는 sigset_t 유형을 통해 조작됩니다. 몇몇 동작은 신호 세트를 사용할 수있다 :

  • sigemptyset 통해 빈 집합 S를 생성 S는 = ∅
  • 는 신호들 sigaddset, S = S∪ {S}
  • 제거를 통해 세트 S에 추가 sigdelset을 통해 세트의 신호 s, S = S \ {s}
  • sigfillset을 통해 모든 가능한 신호 세트를 생성하십시오.
  • 테스트는 신호 s가 sigismember, s∈S를 통해 주어진 집합 S에 있는지?

이러한 설정은 다른 장소에서 사용되는 : 새로운 프로세스의 신호 마스크를 설정, 신호 처리 중에 설정 블로킹 등 계류중인 신호의 집합을 요청

서로 다른 신호를 잡을하려면

, 그것을 일부 포착 기능이 다른 기능으로 중단되어서는 안되기 때문에 특정 신호를 전달하는 동안 차단 될 신호 세트를 추가 할 수 있습니다. 실제로 SIGALRM 전달 중에 SIGINT를 차단하기로 결정했을 때 (주석을 제거했을 때). 그래서 당신은 핸들러의 실행 중에 SIGINT를 보내서 만 이것을 관찰 할 수있다. 실현하기 어렵다.

중요한 예가 어디일까요?

SIGUSR1의 핸들러가 주어진 데이터 구조를 수정하고 SIGUSR2의 핸들러가 동일한 데이터 구조를 사용한다고 가정하십시오. 두 핸들러를 동시에 수행하지 않는 것이 매우 중요합니다. 하나는 다른 핸들러를 따라 실행될 수 있지만 다른 핸들러가 전달되는 동안 핸들러가 인터럽트하지 않으려는 것일 수 있습니다. 귀하의 코드는 자기 - 동시입니다, 단 한 스레드의 경우에도 신호가 동시성으로 이어질 수 있다고합니다.

관련 문제