首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

UNIX网络编程-I/O复用:select函数跟poll函数讲解(六)

2013-10-08 
UNIX网络编程--I/O复用:select函数和poll函数讲解(六)一、select函数select函数允许进程指示内核等待多个事

UNIX网络编程--I/O复用:select函数和poll函数讲解(六)
一、select函数

   select函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或者多个事件发生或经过某个指定的时间后才唤醒进程。

我们所关心的描述字不受限于套接口,任何描述字都可用select来监听。

下面给出了一段使用poll监听套接口的代码

/* include fig02 */for ( ; ; ) {nready = Poll(client, maxi+1, INFTIM);if (client[0].revents & POLLRDNORM) {/* new client connection */clilen = sizeof(cliaddr);connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);#ifdefNOTDEFprintf("new client: %s\n", Sock_ntop((SA *) &cliaddr, clilen));#endiffor (i = 1; i < OPEN_MAX; i++)if (client[i].fd < 0) {client[i].fd = connfd;/* save descriptor */break;}if (i == OPEN_MAX)err_quit("too many clients");client[i].events = POLLRDNORM;if (i > maxi)maxi = i;/* max index in client[] array */if (--nready <= 0)continue;/* no more readable descriptors */}for (i = 1; i <= maxi; i++) {/* check all clients for data */if ( (sockfd = client[i].fd) < 0)continue;if (client[i].revents & (POLLRDNORM | POLLERR)) {if ( (n = read(sockfd, buf, MAXLINE)) < 0) {if (errno == ECONNRESET) {/*4connection reset by client */#ifdefNOTDEFprintf("client[%d] aborted connection\n", i);#endifClose(sockfd);client[i].fd = -1;} elseerr_sys("read error");} else if (n == 0) {/*4connection closed by client */#ifdefNOTDEFprintf("client[%d] closed connection\n", i);#endifClose(sockfd);client[i].fd = -1;} elseWriten(sockfd, buf, n);if (--nready <= 0)break;/* no more readable descriptors */}}}}
其实具体含义和上边的select相似,自己体味即可。


热点排行