select系统调用

select函数允许程序同时在多个底层文件描述符下等待输入完成,这意味着终端仿真程序可一直阻塞到有事可做为止。

select系统调用原型:

1 #include <sys/types.h>
2 #include <sys/time.h>
3
4 int select(int  nfds,  fd_set  *readfds,  fd_set  *writefds,  fd_set  *errorfds,  struct timeval  *timeout) ;

参数1:指定需要测试的文件描述符数目,范围从0到nfds-1,

参数2:指向一组等待可读套接字的指针

参数3:指向一组等待可写套接字的指针

参数4:指向一组等待错误检查的指针

参数5:select函数最多等待的时间,为struct timeval结构

struct timeval结构原型:

1 #include <sys/time.h>
2
3 struct timeval {
4     time_t    tv_sec;       //seconds
5     long       tv_usec;    //microseconds
6 } ;

其中类型time_t在头文件sys/types.h中被定义为一个整数类型。

select调用用于测试文件描述符集合中,是否有一个文件描述符已处于可读状态或可写状态或错误状态,它将阻塞以等待某个文件描述符进入上述状态。select调用对数据结构fd_set进行操作,它是由打开的文件描述符构成的集合。有一组定义好的宏可以用来控制这些集合:

1 #include <sys/types.h>
2 #include <sys/time.h>
3
4 void FD_ZERO(fd_set *fdset);
5 void FD_CLR(int fd, fd_set *fdset);
6 void FD_SET(int fd, fd_set *fdset);
7 void FD_ISSET(int fd, fd_set *fdset);

FD_ZERO用于清空fd_set集合,FD_SET用于将给定的文件描述符加入到集合中,FD_CLR用于将给定的文件描述符从集合中删除,FD_ISSET用于检测给定文件描述符在集合中是否有变化,有变化返回真。

fd_set数据结构原型:

1 typedef struct {
2 #ifdef__USE_XOPEN
3     __fd_mask_bits[__FD_SETSIZE/__NFDBITS];
4 #define__FDS_BITS(set)((set)->fds_bits)
5 #else
6     __fd_mask__fds_bits[__FD_SETSIZE/__NFDBITS];
7 #define__FDS_BIT(set)((set)->__fds_bits)
8 #endif
9 } fdset;
时间: 2024-10-08 19:56:53

select系统调用的相关文章

高性能网络编程 - select系统调用

IO复用使得程序能够同时监听多个文件描述符,比如客户端需要同时处理用户输入和网络连接,服务器端需要同时处理监听套接字和连接套接字,select系统调用可以使得我们监听自己感兴趣描述符,可读,可写,异常等事件.select能处理的异常只有带外数据.能同时处理描述符的数量受限于FD_SETSIZE的大小(一般1024).下面这个程序展示了它的一般用法. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #i

Linux之select系统调用_2

在上一篇博文中,我们的程序中我们有3个客户端,因此也事先建立了3个管道,每个客户端分别使用一个管道向服务器发送消息.而在服务器端使用select系统调用,只要监测到某一管道有消息写入,服务器就将其read,并显示在标准输出上. 本篇文章,我们会让服务器拥有一个管道,专门用于从客户端接收消息(上线通知,发送需要服务器转发的消息以及下线通知).服务器需要维护一个列表(使用结构体),记录哪些用户已经连上服务器用于接收消息的管道.当客户端启动,会向服务器发送上线消息,同时将自己的pid发送给server

套接字之select系统调用

select是IO多路复用的一种方式,用来等待一个列表中的多个描述符的可读可写状态: 1 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp, 2 fd_set __user *, exp, struct timeval __user *, tvp) 3 { 4 struct timespec64 end_time, *to = NULL; 5 struct timeval tv; 6 int r

Linux之select系统调用_1

SYNOPSIS /* According to POSIX.1-2001 */ #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 *

linux下select函数详解及实例

一.概述: 系统提供select函数来实现I/O复用输入/输出模型.select系统调用是用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄中有一个或多个发生生了状态改变. 二.select函数: 以下为man文本中的解释:  /* According to POSIX.1-2001 */        #include <sys/select.h>        /* According to earlier standards */     

Linux中的select,poll,epoll模型

Linux中的 select,poll,epoll 都是IO多路复用的机制. select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作.select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一.select的一个缺点在于单个进程能够监视的文件描

I/O多路转接之select

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

IO多路复用——select

IO多路复用 是同步IO的一种,用一个进程一次等待多个IO就绪事件的发生,加大概率,尽可能高效的等. 适用场景 (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用. (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. (5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O

Python Select 解析

首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组(在linux中一切事物皆文件,块设备,socket连接等.),当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位(变成ready),使得进程可以获得这些文件描述符从而进行后续的读写操作(select会不断监视网络接口的某个目录下有多少文件描述符变成ready状态[在网络接口中,过来一个连接就会