我正在尝试使用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注册处理程序。因此,当警报确实到达时,它不会被捕获,因此,根据默认配置,进程将终止。
另外,您还可以使用select来实现这一点。

关于c - 使用sigaction学习POSIX信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7083605/

10-11 21:45