【发布时间】:2010-10-30 13:32:39
【问题描述】:
我在 Linux 操作系统上使用 C 语言进行编程。我正在编写一个扫描用户输入的程序。但是,我希望 scanf 有一定的时间限制。例如,如果用户在 10 秒内没有在键盘上输入任何内容,它将跳过 scanf 并转到下一行。我正在使用 alarm(10) 等待 10 秒,但是当我转到警报处理程序时,我不知道该怎么做才能跳过 scanf。
是否有跳过 scanf 或例如将 \n 写入输入缓冲区的功能?
【问题讨论】:
我在 Linux 操作系统上使用 C 语言进行编程。我正在编写一个扫描用户输入的程序。但是,我希望 scanf 有一定的时间限制。例如,如果用户在 10 秒内没有在键盘上输入任何内容,它将跳过 scanf 并转到下一行。我正在使用 alarm(10) 等待 10 秒,但是当我转到警报处理程序时,我不知道该怎么做才能跳过 scanf。
是否有跳过 scanf 或例如将 \n 写入输入缓冲区的功能?
【问题讨论】:
从警报处理程序返回; scanf 的返回值应该反映发生了错误情况。 (scanf 出错时返回 EOF)。
注意!您必须使用sigaction,因为signal 可能会使read(),底层scanf() 的系统调用自动重新启动。
#include <stdio.h>
#include <signal.h>
void handler(int signo)
{
return;
}
int main()
{
int x;
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGALRM, &sa, NULL);
alarm(5);
if (scanf("%d", &x) == 1)
{
printf("%d\n", x);
alarm(0); // cancel the alarm
}
else
{
printf("timedout\n");
}
return 0;
}
【讨论】: