目录
  1. 1. select-poll和epoll多路复用(事件驱动)技术
    1. 1.1. select
      1. 1.1.1. 原理解析
      2. 1.1.2. 函数解析
      3. 1.1.3. 实际运用
    2. 1.2. poll
      1. 1.2.1. 原理解析
      2. 1.2.2. 函数解析
      3. 1.2.3. 实际运用
    3. 1.3. epoll
      1. 1.3.1. 原理解析
      2. 1.3.2. 函数解析
      3. 1.3.3. 实际运用
select-poll和epoll多路复用(事件驱动)技术

select-poll和epoll多路复用(事件驱动)技术

linux内核集成了select,poll和epoll三种NIO多路复用技术(多路复用使用事件驱动模型作为编程范式),多路复用技术可以一个进程同时监视多个文件描述符,在大并发条件下可以提高线程利用率,减少线程资源浪费。

select

原理解析

函数解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

#include <sys/select.h>

/*
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
pselect(): _POSIX_C_SOURCE >= 200112L
*/
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);

实际运用

poll

原理解析

函数解析

1
2
3
4
5
6
7
8
9
10
#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

/* See feature_test_macros(7) */
#define _GNU_SOURCE
#include <signal.h>
#include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmo_p, const sigset_t *sigmask);

实际运用

epoll

原理解析

函数解析

1
2
3
4
5
6
#include <sys/epoll.h>
int epoll_create(int size);
int epoll_create1(int flags);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t *sigmask);

实际运用

文章作者: rack-leen
文章链接: http://yoursite.com/2020/06/26/Linux/Linux%E8%BF%90%E7%94%A8%E6%8A%80%E6%9C%AF/select-poll%E5%92%8Cepoll%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-%E4%BA%8B%E4%BB%B6%E9%A9%B1%E5%8A%A8-%E6%8A%80%E6%9C%AF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论