linux select函数用法 && 阻塞与非阻塞IO

转载: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函数时才会将缓冲区的内容写出去,否则只是留在缓冲区中。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值