文件描述符

select模型

℡╲_俬逩灬. 提交于 2019-11-27 21:31:39
select 模型 select函数 #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds: 监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态 readfds:监控有读数据到达文件描述符集合,传入传出参数 writefds:监控写数据到达文件描述符集合,传入传出参数 exceptfds:监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数 timeout:定时阻塞监控时间,3种情况 1.NULL,永远等下去 2.设置timeval,等待固定时间 3.设置timeval里时间均为0,检查描述字后立即返回,轮询 struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; void FD_CLR(int fd, fd_set *set);

关于dup和dup2函数

社会主义新天地 提交于 2019-11-27 21:18:11
  首先dup和dup2函数是用于复制文件描述符的。他们俩的头文件是#include<unistd.h>   先说一下dup函数。函数定义 int dup(fd) fd是一个某一个打开的文件的描述符,它的返回值是当前进程可用的最小的文件描述符,同时这个文件描述符和fd同时文件表中的同一个文件。   对于dup2函数,他也是用于复制文件描述符的但是对于这个函数我们可以指定它的文件描述符值,而不是在进程表的进程表项里查找最小的。函数定义,int dup2(fd1, fd2) 这个函数会先判断fd1和fd2是不是同一个值,如果是的就直接返回fd2。如果不是的,它会先把fd2指向的文件关闭,然后把fd1复制给fd2然后把fd2返回。   因为dup2这个特性,我们有时候会这么用 dup2(fd, STDOUT_FILENO); 我们不要它的返回值,同时把STOUT_FILENO指向fd所指向的文件。另外再加一点,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2),0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联。而我们的printf函数要想输出到屏幕上也需要STOUT_FIENO 而这时候它被指向了一个文件,这样经过这一步以后我们的printf就会直接输出到这个文件里而不会输出到屏幕上

【IO多路复用】

核能气质少年 提交于 2019-11-27 21:11:43
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

进程间通信

徘徊边缘 提交于 2019-11-27 14:05:17
进程间通信   基本介绍:     操作系统提供给用户的几种进程间的通信方式     进程间通信方式是干什么的:       进程间数据传输  数据共享  进程控制  事件通知       正式因为有不同的需求,因此操作系统之间有人提供了多找不同的进程间的通信方式:         续继承与unix而来的管道(匿名管道/命名管道)  共享内存  消息队列  信号量     为什么操作系统要给用户提供进程间通信方式:     进程的独立性导致进程之间没有办法进行通信——由操作系统来提供一个公共的媒介,来进行通信   通信方式:     管道:(本质是内存的缓冲区)       管道创建在内核态,是一个“半双工通信”(提供双向选择但是只能单向传输)。在传输信息时提供io操作——返回文件描述符作为       句柄(两个文件描述符)一个用于写入数据,另一个用于读数据     匿名管道/命名管道:       命名管道:有名字则可以通过名字来打开相同的管道进行通信       匿名管道没有名字,因此只能通过子进程复制父进程的方式实现通信(复制了文件描述符)       *匿名管道只能同于具有亲缘关系的进程通信       *命名管道可以用于任意进程间通信              匿名管道:         创建匿名管道(在创建子进程之前):           int pipe(int

【IO多路复用】 -- 2019-08-16 22:21:40

南笙酒味 提交于 2019-11-27 13:59:13
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

Linux管道及重定向

安稳与你 提交于 2019-11-27 13:55:00
Linux管道及重定向 对 shell 有一定了解的人都知道, 管道 和 重定向 是 Linux 中非常实用的 IPC 机制。在 shell 中,我们通常使用符合 ‘|’ 来表示 管道 ,符号 ‘>’ 和 ‘<’ 表示 重定向 。那么 管道 和 重定向 的真实含义(定义)又是什么呢? 管道 管道的定义 管道 就是一个进程与另一个进程之间通信的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入。它是半双工运作的,想要同时双向传输需要使用两个管道。管道又可以分为匿名管道和命名管道,而 shell 中使用到的是匿名管道,所以本文仅描述匿名管道。 例如命令 ls | grep main.c ,使用了管道来连接了两条命令来执行,能够快速地让我们知道当前目录下是否有 main.c 文件。 管道的本质是 内存中的缓冲区 ,可以看作是打开到内存中的文件。所以需要使用两个文件描述符来索引它,一个表示 读端 ,一个表示 写端 。并且规定, 数据只能从读端读取、只能往写端写入 。 创建管道 使用函数 pipe() 可以创建匿名管道,需要包含头文件 unistd.h ,示例代码: int fd[2]; pipe(fd); 首先创建一个 2 个元素的整型数组,然后将该数组作为 pipe() 的参数, pipe() 执行成功后,数组元素 fd[0] 的值就会变成所创建的管道的读端的文件描述符,

【IO多路复用】 -- 2019-08-16 19:17:42

断了今生、忘了曾经 提交于 2019-11-27 13:34:11
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

高并发服务器epoll接口、epoll Reactor(反应堆)模型详解

核能气质少年 提交于 2019-11-27 12:14:50
epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。 epoll采用的是事件驱动,并且设计的十分高效。在用户空间获取事件时,不需要去遍历被监听描述符集合中所有的文件描述符,而是遍历那些被内核I/O事件异步唤醒之后加入到就绪队列并返回到用户空间的描述符集合。 epoll提供了两种触发模式,水平触发(LT)和边沿触发(ET)。当然,涉及到I/O操作也必然会有阻塞和非阻塞两种方案。目前效率相对较高的是 epoll+ET+非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。 接下来的讲解顺序为: (1) epoll接口的一般使用 (2) epoll接口 + 非阻塞 (3) epoll接口 + 非阻塞 + 边沿触发 (4) epoll反应堆模型 (重点,Libevent库的核心思想) 一、epoll接口的基本思想概述 epoll的设计: (1)epoll在Linux内核中构建了一个文件系统,该文件系统采用红黑树来构建,红黑树在增加和删除上面的效率极高,因此是epoll高效的原因之一。有兴趣可以百度红黑树了解

libevent源码分析一--io事件响应

喜夏-厌秋 提交于 2019-11-27 10:31:14
这篇文章将分析libevent如何组织io事件,如何捕捉事件的发生并进行相应的操作。这里不会详细分析event与event_base的细节,仅描述io事件如何存储与如何响应。 1. select libevent的实现io事件的backend实际上使用的是io复用接口,如select, poll, epoll等,这里以最简单的select为例进行说明。首先简单介绍一下select接口: int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); readfds, writefds, exceptfds均是文件描述符集合,调用该函数后,若readfds集合中的fd可读,或者writefds集合中的fd可写,或者exceptfds集合中的fd发生错误,或者阻塞的时间达到了timeout,函数返回。 函数返回0,返回结果readfds集合中包含了入参readfds中现在读不会被阻塞的fd,返回结果writefds包含了对应的写不会被阻塞的fd,exceptfds包含了所有发生异常的fd。如果超时,函数返回-1,这些集合为空。 可以看到,select调用需要传入感兴趣的io的文件描述符fd,而libevent中大家熟悉的是event_base

关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

谁说胖子不能爱 提交于 2019-11-27 08:04:44
昨天面试的时候没有答上来同步与异步,阻塞与非阻塞的区别,回来搜了一下,发现这篇文章写的不错,转载学习一下,链接如下: https://blog.csdn.net/chen8238065/article/details/48315085 相关资料 IO基本概念 Linux环境 同步异步阻塞非阻塞 同步与异步 阻塞与非阻塞 IO模型Reference Link 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动异步IO模型 异步IO模型 总结 AIOBIONIO Java对BIONIOAIO的支持 AIOReference Link1ReferenceLink2 NIOReference Link epollselectpollReference Link LTETepoll select的几大缺点 poll实现 epollreference Link 总结 IOCP ReferenceLinkConcreteRealization 相关资料 IO基本概念 Linux环境 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)