linux网络编程的IO多路复用是怎么回事??该如何使用??

linux网络编程的IO多路复用是怎么回事??该如何使用??,第1张

linux网络编程的I/O 多路复用。select()函数是系统提供的,它可以在多个描

述符中选择被激活的描述符进行 *** 作。

例如:一个进程中有多个客户连接,即存在多个TCP 套接字描述符。select()函数阻塞

直到任何一个描述符被激活,即有数据传输。从而避免了进程为等待一个已连接上的数据而

无法处理其他连接。因而,这是一个时分复用的方法,从用户角度而言,它实现了一个进程

或线程中的并发处理。

I/O 多路复用技术的最大优势是系统开销小,系统不必创建进程、线程,也不必维护这

些进程/线程,从而大大减少了系统的开销。

select()函数用于实现I/O 多路复用,它允许进程指示系统内核等待多个事件中的任何一

个发生,并仅在一个或多个事情发送或经过某指定的时间后才唤醒进程。

它的原型如下,

#include<sys/time.h>

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

ndfs: select() 函数监视描述符数的最大值。根据进程中打开的描述符数而定,一般设为要

监视的描述符的最大数加1。

readfds: select() 函数监视的可读描述符集合。

writefds: select()函数监视的可写描述符集合。

errorfds: select()函数监视的异常描述符集合。

timeout: select()函数超时结束时间

返回值。如果成功返回总的位数,这些位对应已准备好的描述符。否则返回-1,并在errno

中设置相应的错误码。

FD_ZERO(fd_set *fdset):清空fdset 与所有描述符的联系

FD_SET(int fd, fd_set *fdset):建立描述符fd 与fdset 的联系

FD_CLR(int fd, fd_set *fdset):撤销描述符fd 与fdset 的联系

FD_ISSET(int fd,fd_set *fdset) ::检查与fdset 联系的描述符fd 是否可读写,返回非0表示可读写。

采用select()函数实现I/O 多路复用的基本步骤如下:

(1) 清空描述符集合

(2) 建立需要监视的描述符与描述符集合的联系

(3) 调用select()函数

(4) 检查所有需要监视的描述符,利用FD_ISSET 判断是否准备好

(5) 对已准备好的描述符进行I/O *** 作

直接在代码中调用这个API即可,devm_pinctrl_get_select( struct device *dev, const char *name),参考其他地方的调用,可以直接针对功能进行引脚复用的配置,当然,前提是pinctrl-soc.c里面已经做好了相关配置,这里的soc指的是ARM平台,比如高通、三星、MTK、TI等等。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7281990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存