【问题标题】:learning POSIX signals using sigaction使用 sigaction 学习 POSIX 信号
【发布时间】:2011-08-16 19:05:53
【问题描述】:

我正在尝试使用 POSIX sigaction 函数来学习信号。

我想要做的是提示用户输入。提示后,设置 5 秒警报。如果用户在警报到期之前没有输入任何内容,则会重新提示用户。如果用户确实输入了某些内容,则取消警报并回显输入。如果第三次重新提示后没有输入,则程序退出。

以下是我目前所拥有的。它的作用是,在第一次显示提示后,当没有输入时,它会退出并显示“警报信号”消息。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <signal.h>

volatile sig_atomic_t count = 0;

void sighandler(int signo)
{
  ++count;
}

int main(void)
{
  char buf[10];
  struct sigaction act;
  act.sa_handler = sighandler;

  sigemptyset(&act.sa_mask);

  act.sa_flags = 0;

  if(sigaction(SIGINT, &act, 0) == -1)
  {
    perror("sigaction");
  }

  while(count < 3)
  {
    printf("Input please: ");

    alarm(5);

    if(fgets(buf, 10, stdin))
    {
      alarm(0);
      printf("%s", buf);
    }
  }

return 0;
}

【问题讨论】:

  • 你正在捕捉SIGINT,但警报使用SIGALRM

标签: c linux posix signals


【解决方案1】:

您正在为SIGINT 而不是SIGALRM 注册处理程序。因此,当警报确实到达时,它不会被捕获,因此,根据默认配置,进程会终止。

作为旁注,您也可以为此使用 select

【讨论】:

  • 应该为此使用select,因为它避免了此代码中的(否则不可避免的)竞争条件。 (如果系统真的很忙,所以alarm(5)fgets 之间的时间超过五秒,你将错过信号并永远阻塞fgets。)
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2017-02-06
相关资源
最近更新 更多