UNP——第六章,多路转接IO——select

       int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

    struct timeval {
        long tv_sec; /* seconds */
        long tv_usec; /* microseconds */
        };

nfds

最大文件描述符+1

通过告诉内核最多需要检查的文件描述符数量,以提高效率,(否则内核需要检查所有的文件描述符)

至于为什么是最大文件描述符值+1,表示 需要检查的文件描述符的数量,原因是 文件描述符从0开始,而数量从1 开始。

readfds, writefds, exceptfds

都是传入传出参数

通过位掩码的方式表示监听的文件描述符

      void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);

timeout

可以选择:

一直阻塞,直到有事件触发

阻塞一段时间,直到有事件触发

不阻塞,立即返回

阻塞可能被信号处理中断,而timeout不是传出参数,所以timeout不会记录剩余的等待时间,而是使用上次的值调用。

如果需要剩余的等待时间,可以在select调用前后记录系统时间以计算。

原文地址:https://www.cnblogs.com/yangxinrui/p/12393875.html

时间: 2024-10-15 00:33:55

UNP——第六章,多路转接IO——select的相关文章

【Nginx】I/O多路转接之select、poll、epoll

从socket中读取数据可以使用如下的代码: while( (n = read(socketfd, buf, BUFSIZE) ) >0) if( write(STDOUT_FILENO, buf, n) = n) { printf(“write error”); exit(1); } 当代码中的socketfd描述符所对应的文件表项是处于阻塞时,它会一直阻塞,直到有数据从网络的另一端发送过来.如果它是一个服务器程序,它要读写大量的socket,那么在某一个socket上的阻塞很明显会影响与其它

I/O多路转接之select——基于TCP协议

关于select的基础知识 a. select是系统提供的多路复用输入输出模型.它是用来监视多个文件句柄的状态变化. b. 程序会停在select等,直到被监视的文件句柄至少有一个发生了状态改变. c. 文件句柄是整数 函数 a. 参数 nfds:需要监视的最大文件描述符值加1: struct timeval结构用于描述一段时间长度,若超出这个时间,需要监视的描述符没有发生,则返回0. 3.代码实现  21     //  22     int sock=socket(AF_INET,SOCK_

I/O多路转接之select

系统提供select函数来实现多路复用输入/输出模型.select系统调用时用来让我们程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变.关于文件句柄,其实就是一个整数,我们最熟悉的文件句柄是0,1,2三个,0是标准输入,1是标准输出,2是标准错误输出. 函数原型: 参数: nfds 输入型参数   readfds,writefds,exceptfds,timeout即为输入型参数又为输出型参数 nfds:最大文件描述符+1: rea

I/O多路转接之 select

系统提供select函数来实现多路复用输入/输出模型. 作用:select系统调用是用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变. 函数原型: 参数说明: int nfds:需要监视的最大文件描述符值+1; fd_set *readfds & *writefds & *exceptfds:指向文件描述符的指针:这三个描述符集说明了我们关心的可读.可写或处于异常条件的各个描述符: struct timeval *

I/O多路转接select/poll/epoll

I/O多路转接(多路复用)又被称为“事件驱动”,是操作系统提供的一个功能,当你关心的文件(如socket)可读.可写时(称为事件就绪)采用某种方式通知你,只有收到通知时你才去执行read/write操作,这样在每次读或写时就不会阻塞,即I/O操作中等的部分交给操作系统内核去完成,而read/write之类的操作只需要在事件就绪时完成数据拷贝.等的过程由select/poll/epoll等系统调用触发,这些函数可同时监视多个描述符上的事件是否就绪,因此可以在一个线程内不发生阻塞的交替完成多个文件的

IO多路转接

IO多路转接的技术可以避免阻塞IO的弊端,因为我们有时候需要在多个描述符上读read.写write,如果使用阻塞IO,就有可能长时间阻塞在某个描述符上而影响其它描述符的使用. 关于阻塞IO的处理办法,可以考虑一下几个方案: 1.多进程.弊端是多个进程终止时的通信,增加了程序的复杂度. 2.多线程.弊端是多个线程之间的同步,同样也增加了程序的复杂度. 3.轮询polling.使用非阻塞IO读取数据,弊端是浪费CPU时间,在多任务系统中应当避免使用这种方法. 4.异步IO.用到了信号机制,如系统V的

select函数与I/O多路转接

相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码: while( (n = read(socketfd, buf, BUFSIZE) ) >0) if( write(STDOUT_FILENO, buf, n) = n) { printf("write error"); exit(1); } 当代码中的socketfd描述符所对应的文件表项是处于阻塞时,它会一直阻塞,直到有数据从网络的另一端发送过来.如果它是一个服务器程序,它要读写大量的socke

高性能服务器——I/O多路转接的三种模式(select &poll& epoll)

一.简单的服务器I/O模型 最简单的的TCP服务器,有三种模式: 1.单执行流,一个server端连接一个client端 2.多进程,一个server端通过多进程的方式,每个进程连接一个client端 3.多线程,一个server端通过多进程的方式,每个线程连接一个client端 (http://zhweizhi.blog.51cto.com/10800691/1830267) 这里实现过 要提升服务器性能,其实就是想要让一个server端能在负载允许的情况下,连接尽可能多的client端. 因

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片