在学习ioctl 时常常跟 read, write 混淆。其实 ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的。

而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。

ioctl(keyFd, FIONREAD, &b)

得到缓冲区里有多少字节要被读取,然后将字节数放入b里面。

接下来就可以用read了。

read(keyFd, &b, sizeof(b))

这两个可以用在按键控制上,先是检测按键是否被按下,如果被按下就放在B里,然后user 在读取按键对应数值。

Listing - Getting the number of bytes in the input buffer. 
清单 - 读取串行端口输入缓冲区中的字节数 
#include <unistd.h> 
#include <termios.h> 
int fd; 
int bytes; 
ioctl(fd, FIONREAD, &bytes);  

eg:

 

#include<stdio.h>

#include<stdlib.h>

#include<sys/ioctl.h>

#include<errno.h>

int kbhit(){

  int i;

  if(ioctl(0,FIONREAD,&i)<0){

        printf("ioctl failed, error=%d\n ",errno);

        exit(1);

  }

  return i;

}

main(){

int i=0;

int c=' ';

system("stty raw -echo" );

printf("enter 'q' to quit \n" );

for(;c!='q';++i){

  if(kbhit()){

    c=getchar();

    printf("\n got %c, on iteration %d",c,i);

  }

}

system("stty cooked echo" );

return 0;

}

总言之:

FIONREAD,就是返回缓冲区有多少字节。 输入有个输入缓冲区,用

ioctl(0,FIONREAD,&nread);

能得到缓冲区里面有多少字节要被读取。值放在 nread里面了。

然后就可以 read 了。nread = read(0,buffer,nread);

ioctl与FIONREAD相关推荐

  1. ioctl之FIONREAD

    在学习ioctl 时常常跟 read, write 混淆.其实 ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的. 而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲 ...

  2. 关于 ioctl 的 FIONREAD 参数

    ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的.而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区. ioctl(ke ...

  3. 关于 ioctl 的 FIONREAD 參数

     ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的.而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区. ioctl(k ...

  4. linux_c之ioctl的FIONREAD参数

    ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的. 而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区. FIONREA ...

  5. Linux ioctl FIONREAD 和select 使用

    Linux ioctl FIONREAD 和select 使用 使用select 与ioctl判断socket client是否断开的方式 (1)ioctl + FIONREAD int nsel = ...

  6. ioctl() FIONREAD

    函数名: ioctl 头文件:#include 功能: 控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段.用于向设备发控制和配置命令,有些命令需要控制参数,这些数据是不能用read ...

  7. 【原创】通过 ioctl + FIONREAD 判定数据可读

    [原创]通过 ioctl + FIONREAD 判定数据可读 摩云飞 2016-05-12 09:57:51 浏览470 评论0 libevent ioctl FIONREAD 摘要: 在排查业务 b ...

  8. FIONREAD 判断 socket有多少数据可读

    Ioctl(sockfd, FIONREAD, &npend); /* check FIONREAD support */ 检查 sockfd 表示的文件描述符中有多少数据可以读取 examp ...

  9. Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭

    这里所说的错误有两种: 1.http协议规定的错误,如404错误. 2.server执行过程中的错误.如write错误. 对于http协议规定的错误,这里的"错误"是针对clien ...

最新文章

  1. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法
  2. ug导出step文件失败_解决UG导出CAD图纸失败的问题
  3. malloc 结构体_二进制安全之堆溢出(系列)——堆基础 amp; 结构(二)
  4. php实现直播答题系统,直播答题解决方案
  5. SAP ERP与国内ERP系统的对比,为什么建议选SAP
  6. Java的内存机制(转)
  7. 安川机器人程序还原_安川机器人程序示例
  8. 使用开源软件的优点和缺点是什么
  9. 图片转换成代码的小工具Image2Lcd使用说明
  10. 【Leetcode】1324. Print Words Vertically
  11. startx 及xinit 介绍(经典)
  12. android html 布局设计工具,教你使用Android SDK布局优化工具layoutopt
  13. STM32F103定时器解码PT2262
  14. 18天精读掌握《费曼物理学讲义卷一》 第8天 2019.6.21
  15. 如何在Outlook中单击邮件后立即将其标记为已读
  16. js实现简单的四则运算
  17. ROS Error: [rospack] Error: package ‘map_server‘ not found
  18. 腾讯web前端笔试题及个人答案
  19. 什么是产品操作手册?企业该怎样制作产品操作手册页面?
  20. linux服务器怎么安装vbox,在Linux服务器上使用Vbox安装虚拟机

热门文章

  1. 软件方法笔记6-系统用例规约
  2. 用手机怎么测量米数?这个方法看了就掌握
  3. opengl之glTranslatef()函数和glRotatef()函数和glLoadIdentity()函数
  4. 【K8S】整体原理-什么是K8S K8S能做什么
  5. 两个程序员造就10000亿快手!此刻,宿华身价1300亿
  6. 菜鸟裹裹公布2016阿里包裹里程 收到的包裹可以集里程兑大奖
  7. Fine-grained Image Recognition —— 算法及论文汇总
  8. 天天生鲜项目——提交订单页
  9. 施努卡:机器视觉项目(机器视觉解决方案深圳)
  10. 如何去除ul小圆点的html,[HTML]去除li前面的小黑点,和ul、LI部分属性