【问题标题】:C - Use sigsuspend in a thread doesn't workC - 在线程中使用 sigsuspend 不起作用
【发布时间】:2017-12-09 14:41:57
【问题描述】:

对于家庭作业,我只需要使用linux 系统调用来管理游戏中的信号,在C 中编程。 我必须做的一件事是在thread 中无限调用sigsuspend 并等待SIGALRM,然后如果有信号警报(信号警报)我必须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 ?
}

sigsuspend 部分

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

【问题讨论】:

    标签: c pthreads signals


    【解决方案1】:

    由于sigsuspend(),您创建了一个应该等待信号SIGALRM 的线程,但是您将线程打开给所有信号但是 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);
    

    例如来自 main 线程。

    【讨论】:

    • 好的,谢谢,我怎么知道信号是否被阻塞?我只能用 sigprocmask() 阻止它?
    • sigsuspend 会阻塞上述信号,直到它不阻塞的信号的处理程序被执行。在该处理程序执行之后,信号阻塞状态恢复到调用 sigsuspend 之前的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2018-05-02
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多