zoukankan      html  css  js  c++  java
  • IOCTL函数说明

    IOCTL函数说明 - KPTu - 博客园

    IOCTL函数说明

    当在ioctl里使用FIONREAD时,除了获得所指定的读缓存大小以外,还有清除设备准备就绪状态的作用.

    当38行注释以后, 由于各个设备的状态未被清除,所以循环一直处于非阻塞的状态.不停的打印一个状态(即未清除状态)的信息.

    如果不注释ioctl,那么select会自动清除未准备好的设备状态. 此时阻塞是有效地.

     

    同样的,在socket当中使用select和ioctl时测试结果也是如此:

    View Code
    复制代码
    1 //《linux程序设计》第三版--第15章套接字--select系统调用
    2  #include <sys/types.h>
    3 #include <sys/time.h>
    4 #include <stdio.h>
    5 #include <fcntl.h>
    6 #include <sys/ioctl.h>
    7 #include <unistd.h>
    8
    9  int main()
    10 {
    11 char buffer[128];
    12 int result,nread;
    13 fd_set inputs,testfds;
    14 struct timeval timeout;
    15
    16 FD_ZERO(&inputs);
    17 FD_SET(0,&inputs);
    18
    19 while(1)
    20 {
    21 testfds=inputs;
    22 timeout.tv_sec=2;
    23 timeout.tv_usec=500000;
    24
    25 result=select(FD_SETSIZE, &testfds, (fd_set*)NULL, (fd_set*)NULL, &timeout);
    26
    27 switch(result)
    28 {
    29 case 0:
    30 printf("timeout\n");
    31 break;
    32 case -1:
    33 perror("select");
    34 exit(1);
    35 default:
    36 if(FD_ISSET(0, &testfds))
    37 {
    38 ioctl(0,FIONREAD,&nread);
    39 if(nread==0)
    40 {
    41 printf("keyboard done\n");
    42 exit(0);
    43 }
    44 nread=read(0,buffer,nread);
    45 buffer[nread]=0;
    46 printf("read %d from keyboard: %s",nread,buffer);
    47 }
    48 break;
    49 }
    50 }
    51 }
    复制代码

    参考:

    关于FIONREAD参数作用:

    http://linchunai1212.blog.163.com/blog/static/351121432011117113658376/

    从缓冲上看阻塞与非阻塞socket在发送接收上的区别:

    http://linchunai1212.blog.163.com/blog/static/35112143201111885252175/

     

  • 相关阅读:
    关于用wubi安装Ubuntu,总是提示“没有定义根文件系统”的问题
    linux驱动---字符设备的注册register_chrdev说起
    面试汇总
    面试题(redis)
    面试题(restful)
    面试题(数据库)
    你常用的模块?
    falsk
    面试题
    浅谈virtualenv(虚拟环境)
  • 原文地址:https://www.cnblogs.com/lexus/p/2857848.html
Copyright © 2011-2022 走看看