记得刚学linux的时候,就会听到一句"一切皆文件",上面标准输入、标准输出、标准错误、重定向 blablabla...
今天在写一个基于epoll的聊天室,客户端fork 父进程负责读,子进程负责写,感觉这好像服务端,主从备份..还像nginx中的进程的模型,各个worker 从 listen 后的 master fork出来的 master负责分发,worker负责处理,主要是映射到各个模块进行处理,所以说nginx 真正工作的是各个模块.其实 以上都是我学习的一些感受,时常联系在一起,做一些对比,感觉很有意思,也会加深理解.
我们知道 linux下 0 是标准输入,1是标准输出,2 是标准错误,当然以上所得是文件描述符=,其实套接字底层也是文件描述符,只不过这个文件描述符的功能不同罢了,文件描述符 和内存有很大的关系,以下这个命令可以查看:
cat /proc/sys/fs/file-max 394682
这一点在nginx中体现的更鲜明一点,因为nginx需要处理客户端的连接,所以要维持与客户端的socket连接,高并发,因此维持很多这样的socket。
以上可以看到服务端先创建一个文件描述符 3,然后在内核又创建一个epollfd 句柄 为 4
int epoll_create(int size);是这个函数来做的
所以在epoll 用完之后要记得 close,否则有可能导致fd消耗殆尽.
新建立一个客户端连接到server fd 为 5。