2013-05-21 3 views
0

man 7 signal에는 SIGUSR1이 SIGUSR1 30,10,16 Term User-defined signal 1으로 표시됩니다. 내 C 코드에서 SIGUSR1을 사용하면 값이 10이됩니다. 다른 값인 & 16에 액세스 할 수있는 방법이 있습니까? 괜찮SIGUSR1 대체 값 사용 방법

if(signo == 16) 
{ 
    printf("SIGUSR1 type 2 received\n"); 
} 

편집처럼 내 신호 처리기에서 명시 적으로 사용하는 것입니다 내 코드에서 이미 SIGUSR1을 사용하는 경우 문이있다. 맞춤 신호가 하나 더 필요합니다. RTSIGNALS 및 기타 옵션이 있다는 것을 알고 있습니다. 하지만 나는 그들이 man 페이지에서 16,30을 지정하는 이유를 알고 싶었고 그것을 사용하는 방법을 제공하지 못했습니다.

+3

이식성을 위해 항상'if (signo == SIGUSR1) {}'를 사용해야합니다. –

+0

"맨 페이지에서 16,30을 지정하는 이유를 알고 싶었습니다." 내 대답을 보라. –

답변

3

설명서는 "값"열에 표시된

여러 신호 번호, 건축 의존했다. (세 개의 값이 주어지면 첫 번째 것은 보통 alpha와 sparc, i386, ppc와 sh는 중간, 그리고 mips는 마지막으로 유효하다 - A는 해당 아키텍처에서 신호가 없다는 것을 나타낸다.)

SIGUSR1은 실행중인 시스템에 정확히 하나의 값을 갖습니다. 대체 값이 없습니다. 정의 된 상수 SIGUSR1을 사용하십시오. 16을 사용하면 잘못된 신호를 줄 것입니다 ... 더 자세히 살펴보면 SIGSTKFLT가 보일 것입니다.

나는 SIGUSR2 뭐가 잘못 하나 개 이상의 사용자 정의 신호

해야합니까?

+0

. 내 컴퓨터에서'kill -l'은 신호의 현재 값을 표시하며, 30은'SIGPWR'이고 16은'SIGSTKFLT'입니다. 그래서 거기에는 SIGUSR1이 없습니다. – Alfe

+0

@Alfe "SIGUSR1이 없다"- 당연하지. 하지만 kill -l은 코드에서 일부 정적 문자열을 인쇄하는 것입니다 ... 권위가 없습니다. 즉, SIGUSR1과 같은 기호의 컴파일 시간 값을 알고 있지만 실제로 정의되거나 사용 가능한 값을 알지 못합니다. –

+0

그것은 권위는 아니지만 실제로 시스템에서 사용중인 것입니다. 'kill'소스 코드는 현재 시스템과 일치합니다. – Alfe

0

신호는 한 프로세스에서 다른 프로세스로 전송 된 숫자입니다. 특별한 경우에만 SIGKILL과 같이 시스템이 간섭하여 특별히 처리합니다. 기본값은 신호 번호를 다른 프로세스로 보내고 처리하도록합니다. 이를 포장하고 휴대용으로 만들려면 어떤 상황에 사용되는 번호 (그리고 이러한 규칙을 지원하는 #define) 목록이 있어야합니다. 이러한 규약 중 일부는 man 7 signal이 언급하는 POSIX 표준에 일반화되어 있습니다.

원하는대로 신호를 자유롭게 사용할 수 있습니다 (예 : #define을 사용하지 않고 숫자 만 사용). 이것으로 당신은 이식성과 이해력을 잃을 수 있다는 것을 명심하십시오.

1

SIGUSR1 값은 플랫폼에 따라 다릅니다 .SIGUSR1은 30, 10 또는 16이 될 수 있습니다. 예를 들어, x86 기반 Linux는 SIGUSR1을 10으로 정의합니다. 사실 , SIGUSR1에 30을 사용하는 Linux의 유일한 맛은 DEC Alpha와 SPARC입니다.