fd_set

网络编程12 select多路复用

最后都变了- 提交于 2019-12-12 12:37:14
int select ( int maxfd , fd_set * readset , fd_set * writeset , fd_set * exceptset , const struct timeval * timeout ) ; 返回:若有就绪描述符则为其数目,若超时则为 0 ,若出错则为 - 1 maxfd 表示的是待测试的描述符基数,它的值是待测试的最大描述符加 1。 void FD_ZERO ( fd_set * fdset ) ;        void FD_SET ( int fd , fd_set * fdset ) ;    void FD_CLR ( int fd , fd_set * fdset ) ;     int FD_ISSET ( int fd , fd_set * fdset ) ; struct timeval { long tv_sec ; /* seconds */ long tv_usec ; /* microseconds */ } ; 1、将timeval置为空,表示如果没有IO事件发生就将一直等待下去 2、表示一段固定的时间后,select从阻塞调用中返回 3、将tv_sec和tv_usec都置为0,表示不等待,立即返回 来源: CSDN 作者: track_down 链接: https://blog.csdn.net/qq

vxworks常用API总结

混江龙づ霸主 提交于 2019-12-06 12:38:20
这两天在看VxWorks下的socket网络方面的编程,其中涉及到不少VxWorks下的函数使用,在网上搜了半天觉得这个很不错,于是将其copy下来。最后给出了copy的链接。 vxWorks编程指南 一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #i nclude "taskLib.h" /* 任务 */ #i nclude "msgQLib.h" /* 消息队列 */ #i nclude "semLib.h" /* 信号量 */ #i nclude "ioLib.h" /* IO */ #i nclude "wdLib.h" /* Watch dog */ #i nclude "logLib.h" /* 信息输出 */ #i nclude "socket.h" /* 网络套接字 */ 三、IO系统:ioLib.h 1、系统中的IO设备,包括键盘、串口、文件等,都用统一的接口访问。第一步通常先得到文件描述符,然后进行读写或者设置的工作,最后关闭该描述符。 creat:建立文件 open:得到文件或设备的描述符 read:读文件或设备 write:写文件或设备 ioctl:设置参数 close:关闭文件描述符 remove:删除文件 2、内存文件 memDrv( ) - 初始化伪内存设备

Go netpoll I/O 多路复用构建原生网络模型之源码深度解析

北慕城南 提交于 2019-12-04 04:22:14
Go netpoll I/O 多路复用构建原生网络模型之源码深度解析 (转载) 导言 Go 基于 I/O multiplexing 和 goroutine 构建了一个简洁而高性能的原生网络模型(基于 Go 的I/O 多路复用 netpoll ),提供了 goroutine-per-connection 这样简单的网络编程模式。在这种模式下,开发者使用的是同步的模式去编写异步的逻辑,极大地降低了开发者编写网络应用时的心智负担,且借助于 Go runtime scheduler 对 goroutines 的高效调度,这个原生网络模型不论从适用性还是性能上都足以满足绝大部分的应用场景。 然而,在工程性上能做到如此高的普适性和兼容性,最终暴露给开发者提供接口/模式如此简洁,其底层必然是基于非常复杂的封装,做了很多取舍,也有可能放弃了一些『极致』的设计和理念。事实上 netpoll 底层就是基于 epoll/kqueue/iocp 这些系统调用来做封装的,最终暴露出 goroutine-per-connection 这样的极简的开发模式给使用者。 Go netpoll 在不同的操作系统,其底层使用的 I/O 多路复用技术也不一样,可以从 Go 源码目录结构和对应代码文件了解 Go 在不同平台下的网络 I/O 模式的实现。比如,在 Linux 系统下基于 epoll,freeBSD 系统下基于

网络编程技术-----6、I/O复用实现并发服务器

落花浮王杯 提交于 2019-12-03 07:09:06
网络编程技术-----6、I/O复用实现并发服务器 一、实验要求 服务器:     服务器等待接收客户的连接请求,一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,对接收的字符串按分组进行加密(分组长度为个人学号,密钥为个人序号,分组不够补0),再将加密后的字符发回客户端;之后继续等待接收该客户的信息,直到客户关闭连接,服务器将每个连接的用户所发来的所有数据存储起来,当连接终止后,服务器将显示客户的名字及相应的所有数据。要求服务器具有同时处理多个客户请求的能力。 客户端:     客户首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,指导用户输入的是quit,则关闭连接并退出。 二、实验环境 OS:kali 计算机语言:C 编译器:gcc IDE:VsCode 三、I/O复用涉及到的函数 **FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。** **FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。** *

select

匿名 (未验证) 提交于 2019-12-03 00:32:02
select系统调用是用来让我们的程序监视多个文件句柄(file descrīptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。 文件在句柄在Linux里很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件句柄被创建的都是的,如man socket可以看到“On success, a file descrīptor for the new socket is returned.”而man 2 open可以看到“open() and creat() return the new file descrīptor”,其实文件句柄就是一个整数,看socket函数的声明就明白了: int socket(int domain, int type, int protocol); 当然,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr,0就是stdin,1就是stdout,2就是stderr。 比如下面这两段代码都是从标准输入读入9个字节字符: #include <stdio.h> #include <unistd.h> #include <string.h> int main(int argc, char

IO多路转接------select

匿名 (未验证) 提交于 2019-12-03 00:32:02
五种IO模型 一文中介绍了五种IO模型。在数据通信过程中,分为两部分:一个是等待数据到达内核,一个是将数据从内核拷贝到用户区。在实际应用中,等待的时间往往比拷贝的时间多,所以要提高IO的效率,就要减少等的比重。在阻塞IO,非阻塞IO,信号驱动IO和异步IO中,虽然等待的方式或等待的主体不同,但是无论是谁在等,无论如何等,等待的时间总长是不变的。 五种IO模型 一文中提到,在服务器与客户端进行通信时,服务器要处理多客户端的情形。所以服务器程序首先要使用selcet等系统调用一次等待多个文件描述符,当至少有一个文件描述符满足就绪条件时,select返回,然后进程调用read对满足就绪条件的文件描述符进行读写。将满足就绪条件的所有文件描述符处理完之后,之前的客户端可能还会再次发送消息,所以,此时就需要不断调用select来循环式的等待满足就绪条件的文件描述符,然后对其进行处理。 select #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 参数说明: nfds :表示一次等待的文件描述符的个数加1;用于限定操作系统遍历的区间 fd_set :该结构实际是一个位图,因为文件描述符其实是数组下标

【I/O多路复用】select系统调用

匿名 (未验证) 提交于 2019-12-02 23:49:02
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 ( Creative Commons ) 文章目录 【1】函数原型 【2】各个参数含义 【3】简单理解fd_set结构 【4】select模型的特点 【5】select函数的使用过程 【6】程序示例 【7】select的缺点 【1】函数原型 # include <sys/select.h> int select ( int maxfdp , fd_set * readfds , fd_set * writefds , fd_set * errorfds , struct timeval * timeout ) ; 【2】各个参数含义 int maxfdp 是一个整数值,是指 集合中所有文件描述符的范围 ,即所有文件描述符的最大值加1,因为文件描述符是从0开始的。 struct fd_set 可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄。 readfds 需要检测 可读文件描述符 的集合; writefds 需要检测 可写文件描述符 的集合; errorfds 需要检测的 异常文件描述符 的集合。 fd_set集合可以通过一些宏由人为来操作。如下: # include <sys/select.h> FD_ZERO ( fd_set * fdset

Linux中多路串口Select监听方式

匿名 (未验证) 提交于 2019-12-02 21:56:30
申明:本文转自链接:https://www.jianshu.com/p/a293869bbdb8 串口读函数read是阻塞函数,多路串口接收不太好处理,如果每路串口使用单独的线程接收浪费资源,使用select()函数监听多路串口数据可以把所有接收的数据在一个线程中处理,类似QT中的槽函数功能。 1、函数原型介绍:    int select( int nfds, fd_set *rdfds, fd_set *wtfds, fd_set *exfds, struct timeval *timeout) 入口参数: ①:ndfs:select() 中监视的文件句柄,一般设为要监视的文件中的最大文件号加一。 ②:rdfds:select()监视的可读文件句柄集合,当rdfds映象的文件句柄状态变成可读时系统告诉select函数返回。这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值,可以传入NULL值,表示不关心任何文件的读变化; ③:wtfds: select()监视的可写文件句柄集合,当wtfds映象的文件句柄状态变成可写时系统告诉select函数返回。 如果这个集合中有一个文件可写,select就会返回一个大于0的值

IO复用一select, poll, epoll用法说明

…衆ロ難τιáo~ 提交于 2019-12-02 11:02:21
三种IO复用类型 Select系统调用 #include<sys/select.h> int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* execptfds,struct timeval* timeout); #nfds表示监听的文件描述符总数; #readfds,writefds,execptfds分别表示对应的fd_set类型的集合 可以如下定义:fd_set readfds,writefds,execptfds #timeout表示select函数的超时时间 Struct timeval { Long tv_sec; Long tv_usec; } 如果timeval成员变量均为0,则select立即返回;如果timeout设置为NULL,则select将一直阻塞,直到某个文件描述符就绪。 # FD_ZERO(fd_set *fdset);清楚fdset的所有位,如FD_ZERO(&readfds); #FD_SET(int fd,fd_set* fdset);设置fdset的位,也就是将某个文件描述符加入到fdset中,如FD_SET(0,&readfds),将标准输入加入到fdset中 #int FD_ISSET(int fd,fd_set * fdset);测试fdset的某个位是否被设置

Linux网络编程三、 IO操作

人盡茶涼 提交于 2019-12-01 07:13:32
  当从一个文件描述符进行读写操作时,accept、read、write这些函数会阻塞I/O。在这种会阻塞I/O的操作好处是不会占用cpu宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能处理一个操作,从而使程序的执行效率大大降低。一种解决办法是使用多线程或多进程操作,但是这浪费大量的资源。另一种解决办法是采用非阻塞、忙轮询,这种办法提高了程序的执行效率,缺点是需要占用更多的cpu和系统资源。所以,最终的解决办法是采用IO多路转接技术。   IO多路转接是先构造一个关于文件描述符的列表,将要监听的描述符添加到这个列表中。然后调用一个阻塞函数用来监听这个表中的文件描述符,直到这个表中有描述符要进行IO操作时,这个函数返回给进程有哪些描述符要进行操作。从而使一个进程能完成对多个描述符的操作。而函数对描述符的检测操作都是由系统内核完成的。   linux下常用的IO转接技术有:select、poll和epoll。 select:   头文件:#include <sys/select.h>、#include <sys/time.h>、#include <sys/types.h>、#include <unistd.h>   函数:     int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set