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

时间:2017-12-09 14:41:57

标签: c pthreads signals

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

1 个答案:

答案 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);
例如,线程中的