问题描述
我正在使用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()
可能会更容易处理。