对于家庭作业,我必须只使用linux
次系统调用来管理游戏中的信号,并在C
中编程。
我必须做的一件事是,在thread
中调用无限期的sigsuspend并等待SIGALRM
,然后如果有sigalarm(信号警报),我必须printf()
某事(不是什么都没关系。
但是,我尝试了几件事,但它不起作用,我不知道如何"deblock"
sigsuspend并打印我想要的东西。并且游戏中有一个计时器发送sigalrm。我的代码有效,但不是sigsuspend
的部分
当然,我还有一个sigarlm
处理程序,它在收到SDL
时会对sigarlm
执行一些操作。
我真的不必使用sigsuspend
代码:
//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");
}
}
目前,只有在收到sigarlm
时才打印“在线程中”,我该怎么做才能正确使用sigsuspend
? 我有义务使用sigsuspend
答案 0 :(得分:1)
由于SIGALRM
,您创建了一个应该等待信号sigsuspend()
的线程,而是将线程打开到所有信号但是 SIGALRM
。< / p>
替换
sigemptyset(&mask); // clear mask
sigaddset(&mask, SIGALRM); // set mask to SIGALRM
sigsuspend(&mask); // wait for any signal but blocks SIGALRM
与
sigfillset(&mask); // mask set to all signals
sigdelset(&mask, SIGALRM); // remove SIGALRM from the mask
sigsuspend(&mask); // block all signals but SIGALRM
这样sigsuspend()
等待非阻塞信号(SIGALRM)。
为了进行测试,您可以使用
向线程发送SIGALRM
信号
pthread_kill(tid_sigrecv, SIGALRM);
例如,主线程中的。