几秒钟后如何终止scanf?

问题描述

我正在使用C语言的信号。该程序包括等待几秒钟以供用户键盘输入,如果时间到了,程序将终止。但是,尽管程序没有结束,但时间已经过去,我总是必须输入文本。有什么办法可以避免scanf?

这是我的代码

const post = await newPost.save();
profile.posts.unshift(post);
await profile.save();
res.json(post);

解决方法

您快到了,请先设置闹钟,然后再致电scanf。该信号将中断对read()内部scanf()的呼叫,这将导致scanf()立即返回。

volatile int alarm_flag = 0;
void setflag(int sig) {
    alarm_flag = 1;
}

...

struct sigaction act = {};
act.sa_handler = set_flag;
sigaction(SIGALRM,&act,NULL);

...

    alarm(NSECS);
    scanf("%s",name);
    if (alarm_flag) {
        ...

一些注意事项:

  • alarm_flag应该是volatile

  • setflag应该带有一个int参数。

  • 将函数声明为func(void)而不是func()。将函数声明为func()是1990年前左右的老式样式,而今天使用它并没有好处。 (请注意,C ++是不同的。)

更多说明:

  • 您不应使用== TRUE== FALSE。在这种特殊情况下,它可能会很好地工作,但在某些情况下,它可能会行不通。因此,我几乎永远不会使用== TRUE

  • 作为练习,使用alarm编写此代码是合理的,但是如果您想在生产应用程序中执行此类操作,则可能会使用libuv之类的东西代替{{1 }}。这种方法并不是说错误,而是使用无阻塞IO和alarm()可能会更容易处理。