day12
本章目标
select
限制poll
,也是I/O
复用函数
select限制
用
select
实现的并发服务器,能达到的并发数,受两方面的限制一个进程所能打开的最大文件描述符限制,可以通过调整内核参数来改变,
ulimit -n
查看能打开的文件描描述符的大小,通过ulimit -n num
:通过这条命令修改一个文件所能打开的最大文件描述符的限制,num
为改变之后的最大文件描述符。这个命令只是临时修改,如果需要开机的时候改变的话则需要修改配置文件。发现几个
ulimit
的小坑,以下皆为个人猜想,有一定的实践操作佐证。ulimit -n num
:如果是普通用户每次修改的文件描述符的num
必须小于ulimit -n
的数值的大小,否则会报错误bash: ulimit: open files: cannot modify limit: Operation not permitted
,权限不够,emmm。如果是管理员则不会出现这个错误,可以修改成功。即:管理员可以随意的改大改小,而普通用户只能不断的改小,不能改的比原来的最大能打开的文件描述符数量大。但是可以越改越小… …。
今天下午又试了一次发现普通用户也可以把最大能打开的文件描述符数量增大。… ….
select
中的fd_set
集合容量的限制(FD_SETSIZE,一般为1024),这个需要重新编译内核。
这里是一条插播的关于vim内容
参考文档:
1 | TAB就是制表符,单独拿出来做一节是因为这个东西确实很有用. |
getrlimit和setrlimit
获取一个进程所能打开的最大文件描述符数目。
1 | #include <sys/time.h> |
getrlimit和setrlimit函数使用代码
如果提示权限不够则使用管理员运行。
1 | #include <stdio.h> |
测试一个进程可以打开的最大文件文件描述符
实际上
tag
只能到1021
(ulimit 设置为1024时)。why???,因为还有三个系统已经给你打开的
标准输入0
、标准输出1
和标准错误2
。加起来刚好1024
个。
1 | #include <stdio.h> |
部分程序运行结果(客户端):这个结果有一定的问题,但也是正确的,请仔细阅读理解下面的对于这个原因的解释。
1
2
3
4
5
6 1019
1020
1021
创建scoket失败
: Too many open files
[pip@localhost code]$服务器端理论应该为:
1020
个,因为不仅有标准输入0
、标准输出1
和标准错误2
,还有一个监听套接listenfd
占用了一个文件描述符。则最多接受1020
个连接了。如果服务端一直保持不断开的话。那么客户端也只能连接1020
个,但是由于服务器与客户端的链接关闭了,导致可以连接客户端多于1020个
了。所以上面的客户端的运行结果有一定的问题,服务器的对客户端处理合适,客户端的最大连接到服务器的个数为1020
个,短板效应。
poll函数
也是并发服务器的函数,与
select
类似
1 | #include <poll.h> |
##struct pollfd的events附录