2017-12-09 8 views
1

linux 시스템 호출을 이용하여 C에 프로그램 된 신호를 관리해야한다. 내가해야 할 한 가지는, thread에 무기한으로 sigsuspend를 호출하고 SIGALRM을 기다린 다음 신호가 울리는 신호가있는 경우 printf() (무언가 중요하지 않음)해야합니다.C - 쓰레드에서 sigsuspend를 사용할 수 없다. 숙제를 위해

그러나 몇 가지 시도했지만 작동하지 않습니다, 내가 어떻게 "deblock" sigsuspend하고 원하는 인쇄. 그리고 게임에는 sigalrm을 보내는 타이머가 있습니다. 내 코드는 작동하지만 일부는 sigsuspend sigarlm을받을 때 SDL으로 처리하는 처리기가 있습니다.

//initialising sigaction struct 
int init (void) 

{ 
    // Signal handler 
    sigact.sa_handler = sigalrm_handler; 
    sigact.sa_flags = 0; 
    sigemptyset(&sigact.sa_mask); 


    // Linked list 
    head = NULL; 

    sigaction(SIGALRM, &sigact, NULL); 
    pthread_create(&tid_sigrecv, NULL, (void *)deamon, NULL); 
    return 1; // Implementation ready ? 
} 

sigsuspend 부분 현재

void deamon(void * arg) 
{ 
    int sig; 
    while(1) { 
    sigset_t mask; 
    sigemptyset(&mask); 
    sigaddset(&mask, SIGALRM); 
    sigsuspend(&mask); 
    printf("in thread\n"); 
    } 
} 

그것은 단지 "스레드에서"인쇄되지 않습니다 나는 sigsuspend

코드와 마스크를 사용하는 것이 얼마나 정말하지 않습니다 sigarlm이 수신되면 sigsuspend을 제대로 사용하려면 어떻게해야합니까? 는 나는 당신이 sigsuspend()에 신호를 SIGALRM 감사를 기다려야하는 스레드를 생성, 대신 당신은 모든 신호 하지만SIGALRM에 스레드를 열 sigsuspend

답변

0

를 사용하는 것이 의무입니다.

는 비 차단 신호 (SIGALRM) 용

sigfillset(&mask);   // mask set to all signals 
sigdelset(&mask, SIGALRM); // remove SIGALRM from the mask 
sigsuspend(&mask);   // block all signals but SIGALRM 

이런 방식으로 대기 sigsuspend()

sigemptyset(&mask);   // clear mask 
sigaddset(&mask, SIGALRM); // set mask to SIGALRM 
sigsuspend(&mask);   // wait for any signal but blocks SIGALRM 

바꾸기.

테스트의 경우, 예를 들어, 스레드에게 주요 스레드에서

pthread_kill(tid_sigrecv, SIGALRM); 

를 사용하여 SIGALRM 신호를 보낼 수 있습니다.

+0

감사합니다. 신호가 차단되었는지 어떻게 알 수 있습니까? sigprocmask()로만 차단할 수 있습니까? –

+0

'sigsuspend'는 차단하지 않은 신호에 대한 핸들러가 실행될 때까지 상기 신호를 차단합니다. 그 핸들러 실행 후, 시그널 블로킹 상태는'sigsuspend'를 호출하기 전의 상태로 되돌아갑니다. –