2016-06-01 6 views
1

I의 구조는 다음과 같습니다어떻게 sigaction.sa_flags 하나 개 이상의 플래그를 설정하는

struct sigaction sa1; 
sa1.sa_flags=SA_SIGINFO; 
sa1.sa_flags=SA_NODEFER; 
sa1.sa_sigaction = handler; 
sigaction(SIGUSR1,&sa1,NULL); 

가 어떻게 SA_NODEFER와 함께 SA_SIGINFO를 사용할 수있는 두 번째 플래그는 첫째을 무시하지 않고 있습니까?

같은 [...]

그래서 당신은 할 줄 뭔가 :

그것은 제로 다음 중 한 가지 이상 비트 단위로 OR 형성된다 :

답변

2

The manual page

답이있다

여러 독립 플래그를 하나의 정수로 표현하는이 방법은 모든 프로그래밍과 C에서 매우 일반적입니다. bitwise 조작은 C에서 간단하기 때문에 사용할 수 있으며 매우 가벼운 구현이기 때문에 종종 바람직합니다.

접근 방식은 구조에 비트 필드를 사용할 수 있습니다 더 "현대"(세부 정보 및/또는 Bloaty McBloatface) : 자체가 구성되어 struct

struct sigaction { 
    /* ... */ 
    struct { 
    unsigned int sa_nocldstop : 1; 
    unsigned int sa_nocldwait : 1; 
    unsigned int sa_nodefer : 1; 
    unsigned int sa_nostack : 1; 
    unsigned int sa_siginfo : 1; 
    /* ... */ 
    } sa_flags; 
    /* ... */ 
}; 

struct sigactionsa_flags 회원한다 1 비트 너비의 무리 unsigned int 회원. 일반적으로 정확히 같은 비트 단위 코드로 컴파일되지만 더 명확합니다.

sa1.sa_flags.sa_nodefer = 1; 
sa1.sa_flags.sa_siginfo = 1; 

하고 나머지는 0

로 설정되었다 있는지 확인하는 다른 방법이 필요 것 :

당신은 명시 적 세트를 수행하여 여러 플래그를 설정할 것