问题描述
我想让程序进入睡眠状态一段时间。但我也希望如果按下Enter键,程序就会唤醒。
clock_t t;
int sleep_time=10;
t=clock();
while(1){
int temp=clock()-t;
double time_Now=(double)(temp)/CLOCKS_PER_SEC;
if(time_Now>=sleep_time){
break;
}
if(getchar()=='\n'){
break;
}
}
但是该程序将等待输入,如果未提供输入,它将不会中断 我该怎么做。
解决方法
在POSIX平台上,您可以在标准输入上使用select()
/ poll()
并使用超时参数:
#include <sys/select.h>
#include <unistd.h>
int main(void)
{
fd_set inp; FD_ZERO(&inp); FD_SET(STDIN_FILENO,&inp);
select(1,&inp,&(struct timeval){.tv_sec=1});
}
启用信号处理程序后,您还需要当心EINTR
并用剩余时间重做请求。
不幸的是,您不能指望select()
或poll()
来给您剩余时间(select
可以并且会通过struct timeval*
参数在Linux上使用,但是行为是不可移植的),因此您需要使用clock_gettime
自己进行计算。