Linux网络编程之socket编程(十二)-select,poll

这一次总结并发的一些初步知识,主要有select在实现并发服务器时的两点限制以及poll函数的使用,该函数也是一种I/O复用函数,与select基本相同。

1.select限制

用select实现的并发服务器,能达到的并发数,受两方面限制:

  • 一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。
  • select中的fd_set集合容量的限制(FD_SETSIZE),这需要重新编译内核。

(1)可以通过以下命令查看一个进程能打开的最大文件描述符数:
ulimit -n

(2)以下命令可以进行调整:
ulimit -n 2048
系统所能打开的最大文件描述符个数也是有限的,跟内存大小有关。

2.poll函数

该函数没有FD_SETSIZE的限制。

  • 头文件:#include <poll.h>
  • 原型:int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • 参数:
    fds,通常是一个数组,将要关心的I/O描述符放入该数组中
    nfds,加入数组中的个数,即,要检测的I/O个数
    timeout,超时时间

(1)pollfd结构体:

其中events即感兴趣的事件,revents即返回的事件。如下罗列出events的取值:events

(2)poll 跟 select 还是很相似的,比较重要的区别在于poll 所能并发的个数跟FD_SETSIZE无关,只跟一个进程所能打开的文件描述符个数有关,可以在select 程序的基础上修改成poll 程序,在运行服务器端程序之前,使用ulimit -n 2048 将限制改成2048个,注意在运行客户端进程的终端也需更改,因为客户端也会有所限制,这只是临时性的更改,因为子进程会继承这个环境参数,而我们是在bash命令行启动程序的,故在进程运行期间,文件描述符的限制为2048个。

3.使用poll实现回射客户服务器程序

(1)echosrv.c

小结:
(1)select函数受两点限制,而poll函数只受第一点(一个进程能打开的最大文件描述符个数)的限制。
(2)select和poll函数的共同点是:内核要遍历所有文件描述符,直到找到发生事件的文件描述符。——效率不容乐观。

发表评论

电子邮件地址不会被公开。 必填项已用*标注