IO多路复用(select函数、poll函数、epoll函数)

  • select函数:
	#include 
	int select(int nfds, fd_set *readfds, fd_set *writefds,
                fd_set *exceptfds, struct timeval *timeout);
    /*
	参数:
		nfds:		要监视的最大文件描述符+1
	
		readfds:	要监视的读文件描述符集合 不关心可以传NULL
	
		writefds:	要监视的写文件描述符集合 不关心可以传NULL
	
		exceptfds:	要监视的异常文件描述符集合 不关心可以传NULL
	
		timeout:	超时时间 如果设置成NULL 会一直阻塞 直到有文件描述符就绪
					
	返回值:
	
		成功 就绪的文件描述符的个数
	
		超时 0
	
		失败 -1 重置错误码
	 */
	 				//struct timeval  可以指定超时时间

				    //如果结构体的两个成员都为0 表示非阻塞
				    
				    struct timeval {
				        long    tv_sec;         //秒 
				        long    tv_usec;       //微秒
				    };
				    
		void FD_CLR(int fd, fd_set *set);	//将文件描述符在集合中删除
		
		int  FD_ISSET(int fd, fd_set *set);	//判断文件描述符是否还在集合中
							// 返回0 表示不在了 非0 表示在
		void FD_SET(int fd, fd_set *set);	//向集合中添加一个文件描述符
		
		void FD_ZERO(fd_set *set);			//清空集合

  • poll函数:
	#include 
	int poll(struct pollfd *fds, nfds_t nfds, int timeout);
	/*
	参数:
	
		fds:要监视的文件描述符的集合指向自定义的结构体数据
		
		nfds:fds中已经使用的项目的个数
		
		timeout:超时时间单位是毫秒  
		
				设置成10000 表示10s
				
				-1	永久阻塞
				
				0	非阻塞
	返回值:
	
		0		超时
		-1		出错 重置错误码
		正数	成功 返回的就绪的文件描述符的个数
	*/
			struct pollfd {
			   int   fd;         /* 文件描述符 设置成-1 内核就不再监视这一位了*/
			   short events;     /* 要监视的事件 */
			   short revents;    /* 返回的事件 */
			};
			/*
			要监视的事件是用位运算或起来的
			
			要监视的事件放在events字段,而实际就绪的事件在revents字段返回
			
			POLLIN	读事件
			
			POLLOUT	写时间
			
			POLLERR	异常事件
			*/

  • 创建红黑树(epoll_create函数):
	#include 
	int epoll_create(int size);
	/*
	功能:
		
		创建epoll/创建epoll实例的描述符
	
	参数:
	
	    size:参数已经被忽略了,只需要填写大于0的值即可
	
	返回值:

        epoll_create 调用成功时会返回一个非负整数epfd,
    
        表示新创建的 epoll 实例的文件描述符,
    
        如果调用失败则返回 -1,并设置 errno 变量以指示具体错误原因
     */
  • 将关心的文件描述符加入到红黑树(epoll_ctl函数):
  • 功能:epoll的控制操作或者用于向 epoll 实例中添加、修改、删除事件;
  • epoll_ctl函数:
	int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
	/*
	参数:
	         epfd:epoll的文件描述符
	
	         op:控制方式
	
	            EPOLL_CTL_ADD:添加
	
	            EPOLL_CTL_MOD:修改
	
	            EPOLL_CTL_DEL:删除
	
	         fd:被操作的文件描述符
	
	         event:(事件)结构体指针
	          
	
	返回值:    
				成功返回0,
	
	            失败返回-1 置位错误码
	 */
  • 等待文件描述符中的事件是否就绪,成功则返回就绪的文件描述符的个数(epoll_wait函数):
  • epoll_wait函数:
	int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
	/*
	参数:

		    epfd:epoll的文件描述符
		
		    events:准备好的事件的结构体地址
		
		    maxevents:返回的最大的文件描述符的个数
		
		    timeout:超时
		
		        >0 :毫秒级别的超时时间
		
		        =0 :立即返回
		
		        =-1:不关心超时时间
	返回值:
	
		     成功返回准备好的文件描述符的个数
		
		     返回0代表超时时间到了
		
		     失败返回-1置位错误码
	*/

你可能感兴趣的:(编程基础,C语言)