title: 多输入select

date: 2019/3/20 17:21:34

toc: true

多输入select

IO模型

首先介绍下IO模型,摘录《嵌入式Linux应用程序开发标准教程》

I/O 处理的模型有 5 种。

  • 阻塞 I/O 模型: 在这种模型下,若所调用的 I/O 函数没有完成相关的功能,则会使进程挂起,直到相关数据到达才会返回。对管道设备、终端设备和网络设备进行读写时经常会出现这种情况
  • 非阻塞模型:在这种模型下,当请求的 I/O 操作不能完成时,则不让进程睡眠,而且立即返回。非阻塞 I/O 使用户可以调用不会阻塞的 I/O 操作,如 open()、 write()和 read()。如果该操作不能完成,则会立即返回出错(例如:打不开文件)或者返回 0(例如:在缓冲区中没有数据可以读取或者没有空间可以写入数据)。
  • I/O 多路转接模型:在这种模型下,如果请求的 I/O 操作阻塞,且它不是真正阻塞 I/O,而是让其中的一个函数等待,在这期间, I/O 还能进行其他操作。 select()和 poll 函数()就是属于这种模型。
  • 信号驱动 I/O 模型: 在这种模型下, 通过安装一个信号处理程序, 系统可以自动捕获特定信号的到来,从而启动 I/O。这是由内核通知用户何时可以启动一个 I/O 操作决定的。
  • 异步 I/O 模型:在这种模型下,当一个描述符已准备好,可以启动 I/O 时,进程会通知内核。现在,并不是所有的系统都支持这种模型。

select介绍

更多的可以参考 > http://www.php.cn/linux-370682.html

select()和 poll()的 I/O 多路转接模型是处理 I/O 复用的一个高效的方法。它可以具体设置程序中每一个所关心的文件描述符的条件、希望等待的时间等,从 select()和 poll()函数返回时,内核会通知用户已准备好的文件描述符的数量、已准备好的条件等。通过使用 select()和 poll()函数的返回结果,就可以调用相应的 I/O 处理函数。

小demo

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval; /* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds); /* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */ if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n"); exit(EXIT_SUCCESS);
}

注意

当使用 select()函数时,存在一系列的问题,例如:内核必须检查多余的文件描述符,每次调用 select()

之后必须重置被监听的文件描述符集,而且可监听的文件个数受限制(使用 FD_SETSIZE 宏来表示

fd_set 结构能够容纳的文件描述符的最大数目)等。

引入电子书

这里的思路就是使用select监视两个输入,这里两个输入都是非阻塞的,最后监视使用永远阻塞

int AllInputDevicesInit(void)
{
T_InputOp* now=T_InputOp_list;
int iError = -1; FD_ZERO(&g_fd_set); while (now)
{
if (0 == now->Init())
{
FD_SET(now->fd, &g_fd_set);
if (g_fd_max < now->fd)
{
g_fd_max = now->fd;
}
iError = 0;
}
now = now->next;
}
g_fd_max+=1;
return iError;
} int GetInputEvent(T_InputEvent * out)
{
T_InputOp* now=T_InputOp_list;
int ret;
fd_set read_fd_set=g_fd_set;
// timeout=NULL 是永远等待,如果有数据才返回
ret=select(g_fd_max, &read_fd_set, NULL, NULL, NULL);
if(ret>0)
{
while (now)
{
if (FD_ISSET(now->fd, &read_fd_set))
{
if (0 == now->GetInputEventOp(out))
{
return 0;
}
now = now->next;
}
}
}
return -1;
}

多输入select的更多相关文章

  1. pl/sql快速输入select等语句

    平时对数据库操作的时候,输入DML语句,很浪费时间,我们想要这样的效果 ,输入sf,plsql就会自动输入select * from.我们需要在plsql中进行如下设置即可: 工具(tools)--& ...

  2. 禁止input文本框输入select无法选择

    readonly.disabled.autocomplete readonly表示此域的值不可修改,仅可与 type="text" 配合使用,可复制,可选择,可以接收焦点,后台会接 ...

  3. pl/sql快速输入select * from等语句快捷键设置

    1.工具-->首选项 2.编辑器-->编辑 3.定义快捷键 -- > 保存 4.快捷键+回车就可以出现

  4. Java安全编码之用户输入

    0x00 安全引言 1.传统Web应用与新兴移动应用 (1)传统Web应用:浏览器 HTTP 服务器(2)新兴移动应用:APP HTTP 服务器 从安全角度看,传统Web应用与新兴移动应用没有本质区别 ...

  5. MySQL数据库学习02: SELECT语句

    声明:本篇文章大多数内容出自<MySQL必知必会>,仅供学习参考,勿作他用! 第4章 检索数据 4.1 SELECT语句 SELECT子句用于检索数据库中的表数据.它几乎是MySQL中最常 ...

  6. 第一篇-Html标签中head标签,body标签中input系列,textarea和select标签

    第十四周课程(1-12章节) HTML 裸体 CSS   穿华丽衣服 Javascript 动起来 一 HTML (20个标签) 1.我们的浏览器是socket客户端 2.一套规则,浏览器认识的规则 ...

  7. 3.MySQL必知必会之检索数据-SELECT语句

    本章将介绍如何使用SELECT语句从表中检索一个或多个数据列. 1.SELECT语句 SQL语句是由简单的英语单词构成的.这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的.大概,最经常使 ...

  8. 使用INSERT…SELECT语法插入记录(三十二)

    前面,我们在谈INSERT语句时,使用两种语句:INSERT…SELECT  和  INSERT…VALUES. INSERT…SELECT可以使用子查询.因为在写SELECT时.  ***  =   ...

  9. Linux C++ 网络编程学习系列(2)——多路IO之select实现

    select实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/select 源码说明: server.cpp: 监听127.1:6666 ...

随机推荐

  1. Android Studio教程11-RecycleView的使用

    目录 1. RecyclerView 1.1. Add support library 1.2. 将RecyclerView添加到布局 1.3. 主actiivty中如何调用recycleview对象 ...

  2. 如何取消Microsoft账户登录电脑

    手贱用Microsoft账户登录了一下笔记本里面的日历,TNND微软直接就把你电脑的登录账户直接改成了微软账户,花了1个小时才搞回去. 步骤如下: 0--脑残微软的设计,点了下日历,弹出下面这个,绝对 ...

  3. C# -- 等待异步操作执行完成的方式

    C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] args) { Func<int ...

  4. [BJOI2019]光线[递推]

    题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...

  5. Mac下开发ASP.NET Core应用,我用FineUICore!

    在 Mac 下开发 ASP.NET Core 2.0+ 应用,我用FineUICore! FineUICore:企业级 ASP.NET 控件库,10年持续更新,只为你来:http://fineui.c ...

  6. vue keepalive 动态设置缓存

    场景:A首页.B列表页.C详情页B---->C 缓存‘列表1’详情的数据A---->C 读取‘列表1’详情的数据B---->C (希望清除‘列表1’的缓存,变成缓存‘列表2’详情的数 ...

  7. visual studio 配置属性中增加自定义宏和宏值

    visual studio中有一些预先定义的宏,用于配置项目属性,如SolutionDir.我们也可以自定义类似的宏,从而在配置包含目录(include)或添加依赖项时简化配置项. 如何创建自己的宏呢 ...

  8. ArrayBlockingQueue源码分析

    ArrayBlockingQueue是一个基于数组实现的有界的阻塞队列. 属性 //底层存储元素的数组.为final说明一旦初始化,容量不可变,所以是有界的. final Object[] items ...

  9. 【刷题】【LeetCode】007-整数反转-easy

    [刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接-空 007-整数反转 方法: 弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位 ...

  10. Django ORM多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...