第6章:I/O复用:select和poll函数

来源:互联网 发布:女友养成游戏 知乎 编辑:程序博客网 时间:2024/05/02 00:43

如果一个或多个I/O条件满足,我们可以被通知到。

场合:

1.       当客户处理多个描述字时

2.       一个客户同时处理多个套接口

3.       一个tcp服务器既要处理监听套接口,又要处理已连接的套接口

4.       一个服务器既要处理tcp, 又要处理UDP

5.       一个服务器要处理多个服务或者多个协议

 

I/O模型:

l         阻塞

l         非阻塞

l         信号驱动

l         异步

l         I/O复用

 

<sys/select.h> <sys/time.h>

int select( int maxfdp, fd_set *readset, fd_set *writeset, fd_set * exceptset, const struct timeval *timeout);

返回准备好描述字的整数,0超时,-1出错

struct timeval{

       long       tv_sec; // seconds

       long       tv_usec; //microseconds

}

timeout为空时可能永远等待下去

当他为0时,不等待

 

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);

<stdio.h>

int fileno( FILE *stream);返回文件流使用的文件描述符

 

接受和发送低潮限度目的:在select返回可读或可写条件之前,应用进程可以对多少数据可读或多大空间可写进行控制。

 

批量输入:当发送多个请求后,客户端关闭,但有一些请求在去往服务器的路上,如果这时关闭则不能读取到服务器返回的数据,需要半关闭。即客户端发送一个FIN通知服务器端我数据发送完毕,但仍为读放开套接口描述字。需要函数shutdown

<sys/socket.h>

int shutdown( int sockfd, int howto)    0成功,-1出错

hwoto取值:

SHUT_RD 关闭连接的读这一半,不接受套接口数据,且现留在套接口缓冲区数据作废

SHUT_WR 关闭连接写这一半,半关闭,缓冲区数据都被发送,。

SHUT_RDWR 等效于调用shutdown两次,调用_RD,和_WR

 

<sys/select.h> <signal.h> <time.h>

int pselect( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout,

 const sygset_t *sigmask)

struct timespec{

       time_t tv_sec; //seconds

       long tv_nsec; //nanoseconds

}

自己练习了一下:

 

 

原创粉丝点击