linux开发2-网络编程二之多路复用

操作函数

FD_CLR

将一个文件描述符从监听集合中移除。

void FD_CLR(int fd,fd_set *set);

FD_ISSET

判断一个文件描述符是否在监听集合中。

int FD_ISSET(int fd,fd_set *set);

返回值:1存在,0不存在。

FD_SET

将待监听的文件描述符,添加到监听集合中。

void FD_SET(int fd,fd_set *set);	//把前面的fd设置到后面的fd_set中,将fd对应的标志位设置为1

fd_set rdset;
FD_SET(fd,&rdset);		//把fd描述符放到检测集合reset中。

FD_ZERO

清空一个文件描述符集合。

void FD_ZERO(fd_set *set);	//将set集合中所有文件描述符对应的标志位设置为0,集合中没有添加任何文件描述符。
//例子
fd_set reset;
FD_ZERO(&reset);

select

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

//例子
while(1)
{
	int num = select(maxfd+1,&retemp,NULL,NULL,NULL);
}
  • nfds:监控的文件描述符集里最大文件描述符+1,因为此参数会告诉内核检测前多少个文件描述符的状态。
  • readfds:监控有读数据文件描述符的集合,传入传出参数。
  • writefds:监控写数据到达文件描述符集合,传入传出参数。
  • execptfds:监控异常发生到达文件描述符集合,如带外数据到达异常,传入传出参数。
  • timeout:定时阻塞监控时间,3种情况:
  1. NULL,永远等待,阻塞监听。
  2. 设置timeval,等待固定时间
  3. 设置timeval里时间均为0,检查描述字后立即返回,轮询。

返回值:

  1. 大于0所有监听集合(3个)中,满足对应事件的总数。
  2. 0 没有满足监听条件的文件描述符。
  3. -1 错误error。

fd_set

它有1024个标志位。对应相应的文件描述符表。

poll

epoll

posted @ 2024-06-30 16:24  alvinlyb  阅读(23)  评论(0)    收藏  举报