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
감사합니다. 신호가 차단되었는지 어떻게 알 수 있습니까? sigprocmask()로만 차단할 수 있습니까? –
'sigsuspend'는 차단하지 않은 신호에 대한 핸들러가 실행될 때까지 상기 신호를 차단합니다. 그 핸들러 실행 후, 시그널 블로킹 상태는'sigsuspend'를 호출하기 전의 상태로 되돌아갑니다. –