我正在尝试使用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/