poll

文件IO之多路复用-poll

回眸只為那壹抹淺笑 提交于 2020-02-21 06:55:47
1.函数原型 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout) 参数1:多个文件描述符的集合,为一个数组指针 struct pollfd{ int fd; // 文件描述符 short events; // 期望监控的文件描述符事件:PLLIN,PLLOUT,PLLERR short revents; // 事件结果:PLLIN,PLLOUT,PLLERR }; 参数2:被监控的文件描述符的个数 参数3:监控的时间,单位为ms,负数表示-无限监控 返回值:负-出错,正-监控到有效事件,0-监控时间到。 2.用法-应用程序中怎么调用poll a.打开要监控的文件,并保存文件描述符到struct follfd fds[]数组中。并将要监控的文件描述符信息填到 fds[]数组中。 struct follfd fds[2]; // 建立要监控的文件描述符数组 // 初始化数组,将要监控的文件描述符信息填入数组。 fds[0].fd = STDIN //打开的文件描述符 fds[0].event = POLLIN //监听的事件 fds[1].fd = STDERR //打开的文件描述符 fds[1].event = POLLIN //监听的事件 b.调用poll函数 int ret = poll

[复习]select, poll, epoll

霸气de小男生 提交于 2020-02-20 14:16:17
推荐阅读 Linux IO模式及 select、poll、epoll详解 补充:epoll的回调机制 epoll是对select系统调用的改善,适用于同时关注文件比较多的时候的一个中优化方法,例如一个具有大量连接的系统。 那么select的缺点在哪里呢? 当select被唤醒的时候,它并不知道是被哪个或者哪些文件唤醒的,所以它要对位图中所有的文件进行遍历查询(调用该文件的poll接口)。 可以想象,如果select的文件比较多,并且大部分文件都是不活跃的,那么这些select中的大部分poll将会没有任何意义。 所以epoll就使用一个相对智能的回调机制: 当某个文件准备好之后要唤醒等待线程时,它不是简单的把等待者设置为可运行,它还会进一步在等待者的结构中刻上“XXX到此一游”,这样,当线程被唤醒之后,它就可以通过这些留言看到是谁唤醒了自己,而不是逐个询问刚才是谁把我唤醒了。 这里就体现了软件中比较常用的“回调机制”(callback),当然有些比较通俗的叫法就叫做“钩子”(hook),也就是在某些事件发生的时候知会一些实体,知会的方法就是调用对方提供的钩子函数。因为可能某一个实体对一个事件的发生很感兴趣,但是这个事件并不是随时随地都会发生的,而具体在什么时候发生只有"体制内"流程才知道。比方说你去一个地方找一个同事A,但是他不在,你可能会给他附近的同事B说:

IO 多路转接 epoll

☆樱花仙子☆ 提交于 2020-02-20 01:15:28
read 函数返回值 >0 :实际读到的字节数 =0 :socket中,表示对端关闭 close() -1 : 如果errno = EINTR 被异常中断。需要重启。 如果errno =EAGIN 或 EWOULDBLOCK 以非阻塞的方式读数据,但是没有数据。需要再次读 如果errno = ECONNRESET 说明连接被重置。需要close()。 移除监听队列 错误 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 * soft nofile 65536 -->设置默认值 可以直接借助命令修改【注销用户 使其生效】 * hard nofile 100000 --》命令修改上限 命令修改: ulimit -n 21000 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 *

linux网络编程IO模型

为君一笑 提交于 2020-02-18 22:25:37
同步与异步 : 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。 阻塞与非阻塞 阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 五种IO模型 对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段: 1. 准备数据 2. 将数据从内核缓冲区拷贝到进程地址空间 由于存在这两个阶段,Linux产生了下面五种IO模型。 阻塞IO 当用户进程调用了recvfrom调用时,内核进入IO的第一个阶段:准备数据(内核需要等待足够的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。 Linux中,默认情况下所有的socket都是阻塞的。 非阻塞IO 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。用户进程判断结果是一个error时,它就知道数据还没有准备好

Linux网络编程-IO复用技术

爷,独闯天下 提交于 2020-02-18 22:25:16
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了。Linux中,提供了select、poll、epoll三种接口函数来实现IO复用。 1、select函数 #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // 返回:若有就绪描述符则为其个数,超时为0,出错-1 nfds参数指定了被监听文件描述符的个数,通常设置为监听的所有描述符最大值加1,因为文件描述符是从0开始的。readfs、writefds和exceptfds分别对应可读、可写和异常等事件文件描述符集合,当调用select时,通过这3个参数传入自己感兴趣的文件描述符,select函数返回后,内核通过修改他们来通知应用程序那些文件描述符已经就绪。 fd_set结构体包含一个整形数组,该数组中每一个元素的每一位标记一个文件描述符,fd_set容纳的文件描述符数量由FD_SETSIZE指定,这就限制了select能同时处理的文件描述符最大个数

PHP 和 AJAX 投票

我们两清 提交于 2020-02-18 16:14:17
AJAX 投票 在这个 AJAX 实例中,我们将演示一个投票程序,网页在不重新加载的情况下,就可以获得结果。 到目前为止,您喜欢 PHP 和 AJXA 吗? Yes: No: 本例包括四个元素: HTML 表单 JavaScript PHP 页面 存放结果的文本文件 HTML 表单 这是 HTML 页面。它包含一个简单的 HTML 表单,以及一个与 JavaScript 文件的连接: <html><head><script src="poll.js"></script> </head><body><div id="poll"><h2>Do you like PHP and AJAX so far?</h2><form>Yes: <input type="radio" name="vote" value="0" onclick="getVote(this.value)"><br />No: <input type="radio" name="vote" value="1" onclick="getVote(this.value)"></form></div></body></html> 例子解释 - HTML 表单 正如您看到的,上面的 HTML 页面包含一个简单的 HTML 表单,其中的 <div> 元素带有两个单选按钮。 表单这样工作: 当用户选择 "yes" 或 "no" 时

Python Select 解析

怎甘沉沦 提交于 2020-02-18 07:13:43
首先列一下,select、poll、epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()来调用系统监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。 poll poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。 poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

select,poll,epoll笔记

不想你离开。 提交于 2020-02-17 11:08:22
进程获取磁盘中的数据过程: 1.进程向内核发起一个调用 2.内核收到系统调用,向磁盘发送读取命令 3.磁盘收到内核命令后,将文件载入到内核的内存空间里面 4.内核的内存空间接收到数据后,将数据copy到进程的内存空间(此处发生IO) 5.进程的内存空间得到数据后,给内核发送通知 6.内核把接收到的通知回复给进程,此过程为唤醒进程,然后进程得到数据进行下一步操作 阻塞:进程发起IO调用,进程又不得不等待IO完成,此时CPU把进程切换出去,进入睡眠状态,称为阻塞IO 非阻塞:进程发起IO调用,知道还需一段时间完成,就立即通知进程进行别的操作,则为非阻塞IO 事件(信号)驱动I/o 水平触发的事件驱动机制:内核通知进程来读取数据,进程可以不立即处理,下次调用epoll_wait()会再次通知 边缘触发:内核只通知一次让进程来读取数据,进程可以在超时时间内随时来读取数据 NGINX采用了边缘触发 Reactor模型,处理并发IO比较常见的一种模式,用于同步IO 来源: CSDN 作者: climzhong 链接: https://blog.csdn.net/weixin_43858402/article/details/104353874

Djangobook note

寵の児 提交于 2020-02-16 07:56:59
Ref example: djangoproject tutorial 1-4 http://blog.chinaunix.net/u/15586/showart_1226813.html 10 mins a blog http://blog.ericsk.org/archives/815 MTV frameworkIn the MTV development pattern, “M” stands for model, the data-access layer. This layer contains anything and everything about the data: how to access it,how to validate it, which behaviors it has and the relationships between the data. “T” stands for template, the presentation layer. This layer contains presentation-related decisions: how something should be displayed on a Web page or other type of document. “V” stands for view, the

Linux驱动开发之中断编程

时光毁灭记忆、已成空白 提交于 2020-02-12 22:56:05
2020-02-12 关键字: 在 Linux 内核当中,处理一个中断事件需要知道两件事: 1、中断号码 2、中断处理函数 而在 ARM 中处理中断则需要知道以下四件事: 1、中断源号码 2、初始化中断控制器 3、初始化 CPU 中断功能 4、中断处理函数 获取中断号有以下两种方式: 1、宏定义 通过查询芯片手册上记载的相应中断编号,再经过系统预置的 IRQ_EINT(编号) 来得到中断号。 2、设备树文件 首先查询相应设备树头文件 dtsi,找到我们要用的那个中断组的描述,形如下所示: gpx1: gpx1{   gpio-controller;   #gpio-cells = <2>;   interrupt-controller;   interrupt-parent = <&gic>;   interrupts = <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>, <0 28 0>;   #interrupt-cells = <2> }; 上面的 interrupt-controller; 表示以下描述的是和中断控制器相关的信息。 interrupts 描述的是 gpx1 这个节点所要控制或者说使用的中断号列表。 #interrupt-cells 描述的是长度,记住是长度就好了。 其次再在我们自己的 dts 里添加上我们想要的中断信息节点: