gpt4 book ai didi

C - 在线程中使用 sigsuspend 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:35 25 4
gpt4 key购买 nike

对于家庭作业,我必须只使用 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);

例如,来自线程。

关于C - 在线程中使用 sigsuspend 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47729720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com