转载:https://blog.csdn.net/zhandoushi1982/article/details/5070107
检测键盘有无输入,完整的程序如下:
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
char buf[10]="";
fd_set rdfds;
struct timeval tv;
int ret;
FD_ZERO(&rdfds);
FD_SET(0,&rdfds); //文件描述符0表示stdin键盘输入
tv.tv_sec = 3;
tv.tv_usec = 500;
ret = select(1,&rdfds,NULL,NULL,&tv); //第一个参数是监控句柄号+1
if(ret<0)
printf("selcet error\r\n");
else if(ret == 0)
printf("timeout \r\n");
else
printf("ret = %d \r\n",ret);
if(FD_ISSET(0,&rdfds)){ //监控输入的确是已经发生了改变
printf(" reading");
read(0,buf,9); //从键盘读取输入
}
write(1,buf,strlen(buf)); //在终端中回显
printf(" %d \r\n",strlen(buf));
return 0;
}
用gcc编译,执行./a.out。可以得到执行结果,如果不输入,则一会儿会回显:
如果有输入,则回显:
第一个"s"是打字输入的回显。后面开始执行,有个疑问是:在stdout的输出为什么会出现在reading显示的前面?论执行顺序应该是后面才对。
stdout的输出为什么在reading前面是因为:write是无缓冲的I/O操作,printf是有缓冲的I/O操作。有缓冲的I/O只有缓冲区满、遇到\n或者调用fflush函数时才会将缓冲区的内容写出去,否则只是留在缓冲区中。