在用户空间创建好epoll对象后,就会向其注册socket,并设置好感兴趣的事件。这个步骤是epoll的核心,是后续调用的epoll_wait打下基础。在该系统调用中会为socket设置回调函数,这样事件就绪时会自动修改epoll中的事件列表,而不用用户进程的介入,这也是为什么epoll很高效的原因。
在Linux中,不管是在服务端,还是在客户端,都会通过调用recv或recvfrom系统调用来获取对方发送来的数据,如果有数据,那么就读取并交给用户线程来处理,但如果没有数据线程则会阻塞。本文就来分析一下recv系统调用的执行过程。
epoll_wait是epoll的核心,用来获取注册到该epoll上的就绪事件。在Linux中的recv系统调用一文中分析了传统的阻塞IO是怎么进行阻塞和唤醒的,而epoll_wait也是可以限时阻塞的,那通过本文的分析可以对比一下两者的执行过程有什么区别。
"一切皆文件"是Linux的设计哲学,在网络编程中也不例外。不管是在服务端还是在客户端,都会调用socket系统调用来创建一个socket虚拟文件,该系统调用返回该文件的fd,后续的操作都会基于该fd。本文就来分析一下在socket系统调用的底层做了哪些事情。