对于家庭作业,我必须只使用 linux
系统调用来管理游戏中的信号,用 C
编程。我必须做的一件事是在 thread
中无限期调用 sigsuspend 并等待 SIGALRM
,然后如果有 sigalarm(信号警报)我必须 printf()
一些东西(不管是什么)。
但是,我尝试了几种方法但没有用,我不知道如何“deblock”
sigsuspend 并打印我想要的内容。并且游戏中有一个发送信号的计时器。我的代码有效,但不是带有 sigsuspend
的部分当然,我还有一个 sigarlm
处理程序,它在接收到 sigarlm
时用 SDL
做一些事情。我真的不知道如何将掩码与 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 ?
}
信号暂停部分
void deamon(void * arg)
{
int sig;
while(1) {
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
sigsuspend(&mask);
printf("in thread\n");
}
}
目前它只在收到 sigarlm
时不打印“in thread”,我应该怎么做才能正确使用 sigsuspend
? 我有义务使用sigsuspend
由于 sigsuspend()
,您创建了一个应该等待信号 SIGALRM
的线程,但是您却向所有信号打开线程 but SIGALRM
。
替换
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);
例如,来自主线程。
我是一名优秀的程序员,十分优秀!