当前位置: 首页 > news >正文

微营销 网站模板东莞网站关键词排名

微营销 网站模板,东莞网站关键词排名,长沙互联网网站建设,哈尔滨公司做网站poll 和 select 是Linux 系统中用于多路复用 I/O 的系统调用#xff0c;它们允许一个程序同时监视多个文件描述符#xff0c;以便在任何一个文件描述符准备好进行 I/O 操作时得到通知。 一、select select 是一种较早的 I/O 多路复用机制#xff0c;具有以下特点#xff…poll 和 select 是Linux 系统中用于多路复用 I/O 的系统调用它们允许一个程序同时监视多个文件描述符以便在任何一个文件描述符准备好进行 I/O 操作时得到通知。 一、select select 是一种较早的 I/O 多路复用机制具有以下特点 接口 select 使用三个文件描述符集合读、写、异常来监视文件描述符的状态。 函数签名为 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);nfds 是需要监视的文件描述符的数量通常是最大文件描述符加一。 fd_set 是一个位图结构用于表示文件描述符集合。 timeout 指定等待事件发生的超时时间。 限制 select 的文件描述符数量受到 FD_SETSIZE 的限制通常为 1024。这意味着它不适合处理非常大量的并发连接。 效率 每次调用 select 都需要重新初始化文件描述符集合因此在处理大量文件描述符时效率较低。 可移植性 select 是 POSIX 标准的一部分因此在许多操作系统上都可用。 select 示例同时监视多个文件描述符的 I/O 事件 这个例子展示了如何使用 select 来监视两个文件描述符标准输入通常是终端输入和一个网络套接字。 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/select.h #include sys/socket.h #include netinet/in.h#define PORT 8080 #define BUFFER_SIZE 1024int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t clilen;char buffer[BUFFER_SIZE];fd_set readfds;int maxfd;// 创建套接字sockfd socket(AF_INET, SOCK_STREAM, 0);if (sockfd 0) {perror(socket creation failed);exit(EXIT_FAILURE);}// 初始化服务器地址结构memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字if (bind(sockfd, (struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}// 监听if (listen(sockfd, 5) 0) {perror(listen failed);close(sockfd);exit(EXIT_FAILURE);}// 接受一个连接clilen sizeof(cliaddr);newsockfd accept(sockfd, (struct sockaddr *)cliaddr, clilen);if (newsockfd 0) {perror(accept failed);close(sockfd);exit(EXIT_FAILURE);}while (1) {// 清空文件描述符集合FD_ZERO(readfds);// 将标准输入和新套接字添加到集合中FD_SET(STDIN_FILENO, readfds);FD_SET(newsockfd, readfds);maxfd (STDIN_FILENO newsockfd) ? STDIN_FILENO : newsockfd;// 使用 select 监视if (select(maxfd 1, readfds, NULL, NULL, NULL) 0) {perror(select error);break;}// 检查标准输入是否有数据if (FD_ISSET(STDIN_FILENO, readfds)) {if (fgets(buffer, BUFFER_SIZE, stdin) ! NULL) {printf(Input from stdin: %s, buffer);}}// 检查套接字是否有数据if (FD_ISSET(newsockfd, readfds)) {int n read(newsockfd, buffer, BUFFER_SIZE);if (n 0) {printf(Client disconnected\n);break;}buffer[n] \0;printf(Received from client: %s, buffer);}}close(newsockfd);close(sockfd);return 0; }二、poll poll 是 select 的改进版本提供了一些更灵活的特性 接口 poll 使用一个结构体数组来监视文件描述符的状态。 函数签名为 int poll(struct pollfd *fds, nfds_t nfds, int timeout);pollfd 结构体包含文件描述符及其感兴趣的事件。 timeout 以毫秒为单位指定等待事件发生的超时时间。 无数量限制 poll 不受 FD_SETSIZE 限制因此可以监视的文件描述符数量仅受系统资源的限制。 效率 由于 poll 使用数组而不是位图每次调用不需要重新初始化整个集合但仍然需要扫描整个数组因此在处理非常大量文件描述符时效率也受到限制。 事件类型 poll 可以监视更多类型的事件如挂起和优先级数据。 poll 示例监视标准输入和一个网络套接字 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include poll.h #include sys/socket.h #include netinet/in.h#define PORT 8080 #define BUFFER_SIZE 1024int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t clilen;char buffer[BUFFER_SIZE];struct pollfd fds[2];// 创建套接字sockfd socket(AF_INET, SOCK_STREAM, 0);if (sockfd 0) {perror(socket creation failed);exit(EXIT_FAILURE);}// 初始化服务器地址结构memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字if (bind(sockfd, (struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}// 监听if (listen(sockfd, 5) 0) {perror(listen failed);close(sockfd);exit(EXIT_FAILURE);}// 接受一个连接clilen sizeof(cliaddr);newsockfd accept(sockfd, (struct sockaddr *)cliaddr, clilen);if (newsockfd 0) {perror(accept failed);close(sockfd);exit(EXIT_FAILURE);}// 设置 poll 文件描述符fds[0].fd STDIN_FILENO;fds[0].events POLLIN;fds[1].fd newsockfd;fds[1].events POLLIN;while (1) {// 使用 poll 监视int ret poll(fds, 2, -1);if (ret 0) {perror(poll error);break;}// 检查标准输入是否有数据if (fds[0].revents POLLIN) {if (fgets(buffer, BUFFER_SIZE, stdin) ! NULL) {printf(Input from stdin: %s, buffer);}}// 检查套接字是否有数据if (fds[1].revents POLLIN) {int n read(newsockfd, buffer, BUFFER_SIZE);if (n 0) {printf(Client disconnected\n);break;}buffer[n] \0;printf(Received from client: %s, buffer);}}close(newsockfd);close(sockfd);return 0; }三、epoll epoll 是 Linux 内核提供的一种高效的 I/O 事件通知机制用于处理大量文件描述符的事件。它是 poll 和 select 系统调用的改进版本专为解决在处理大量并发连接时的性能问题而设计 epoll 的主要特点包括 高效性与 select 和 poll 不同epoll 不需要在每次调用时重新传递所有的文件描述符集。它通过一个文件描述符来管理感兴趣的事件减少了内核和用户空间之间的数据拷贝。水平触发和边缘触发epoll 支持两种触发模式。水平触发Level-Triggered模式类似于 select 和 poll 的工作方式而边缘触发Edge-Triggered模式则更加高效但也更复杂需要更仔细的事件处理。支持大规模连接epoll 能够更好地处理大规模并发连接因此非常适合用在高性能服务器应用中如网络服务器或代理服务器。事件注册和监听分离通过 epoll_ctl 可以动态地添加、修改或删除监听的文件描述符而 epoll_wait 用于等待事件的发生。 使用 epoll 通常涉及三个主要的系统调用 epoll_create创建一个 epoll 实例。epoll_ctl注册、修改或删除感兴趣的事件。epoll_wait等待事件的发生并获取事件列表。 epoll 是 Linux 特有的 I/O 多路复用机制专为处理大量并发连接而设计。与 select 和 poll 相比epoll 更高效因为它在内核中维护一个事件表避免了每次调用都需要重新传递完整的文件描述符集合。 应用示例监视标准输入和一个网络套接字。 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include errno.h #include sys/epoll.h #include sys/socket.h #include netinet/in.h#define PORT 8080 #define BUFFER_SIZE 1024 #define MAX_EVENTS 10int main() {int sockfd, newsockfd, epollfd;struct sockaddr_in servaddr, cliaddr;socklen_t clilen;char buffer[BUFFER_SIZE];struct epoll_event ev, events[MAX_EVENTS];int nfds;// 创建套接字sockfd socket(AF_INET, SOCK_STREAM, 0);if (sockfd 0) {perror(socket creation failed);exit(EXIT_FAILURE);}// 初始化服务器地址结构memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字if (bind(sockfd, (struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}// 监听if (listen(sockfd, 5) 0) {perror(listen failed);close(sockfd);exit(EXIT_FAILURE);}// 创建 epoll 实例epollfd epoll_create1(0);if (epollfd -1) {perror(epoll_create1 failed);close(sockfd);exit(EXIT_FAILURE);}// 将监听套接字添加到 epoll 实例中ev.events EPOLLIN;ev.data.fd sockfd;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, ev) -1) {perror(epoll_ctl: sockfd);close(sockfd);close(epollfd);exit(EXIT_FAILURE);}// 将标准输入添加到 epoll 实例中ev.events EPOLLIN;ev.data.fd STDIN_FILENO;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, ev) -1) {perror(epoll_ctl: stdin);close(sockfd);close(epollfd);exit(EXIT_FAILURE);}while (1) {// 等待事件发生nfds epoll_wait(epollfd, events, MAX_EVENTS, -1);if (nfds -1) {perror(epoll_wait failed);break;}for (int n 0; n nfds; n) {if (events[n].data.fd sockfd) {// 处理新连接clilen sizeof(cliaddr);newsockfd accept(sockfd, (struct sockaddr *)cliaddr, clilen);if (newsockfd -1) {perror(accept failed);continue;}// 将新连接添加到 epoll 实例中ev.events EPOLLIN;ev.data.fd newsockfd;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, newsockfd, ev) -1) {perror(epoll_ctl: newsockfd);close(newsockfd);continue;}} else if (events[n].data.fd STDIN_FILENO) {// 处理标准输入if (fgets(buffer, BUFFER_SIZE, stdin) ! NULL) {printf(Input from stdin: %s, buffer);}} else {// 处理来自客户端的数据int n read(events[n].data.fd, buffer, BUFFER_SIZE);if (n 0) {if (n 0) {printf(Client disconnected\n);} else {perror(read error);}close(events[n].data.fd);} else {buffer[n] \0;printf(Received from client: %s, buffer);}}}}close(sockfd);close(epollfd);return 0; }解释 创建套接字首先创建一个 TCP 套接字并绑定到指定端口然后开始监听连接。创建 epoll 实例使用 epoll_create1 创建一个新的 epoll 实例。注册文件描述符将监听套接字和标准输入文件描述符注册到 epoll 实例中以便监视它们的可读事件。事件循环使用 epoll_wait 等待事件发生。当有事件发生时检查是哪种事件并进行相应处理 如果是监听套接字有事件表示有新连接到达使用 accept 接受连接并将新套接字注册到 epoll 实例中。如果是标准输入有事件读取输入并处理。如果是客户端套接字有事件读取数据并处理。 清理在程序结束时关闭所有打开的文件描述符。 四、总结 poll和select机制 用户空间到内核空间的拷贝每次调用 select 或 poll 时用户必须将所有需要监视的文件描述符列表传递给内核。这意味着每次调用都需要将这些数据从用户空间复制到内核空间这在监视大量文件描述符时效率较低。线性扫描内核需要扫描所有文件描述符以确定哪些文件描述符有事件发生。这种线性扫描在文件描述符数量很大时效率不高。 #mermaid-svg-247d9xMDsXNSdzQy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-247d9xMDsXNSdzQy .error-icon{fill:#552222;}#mermaid-svg-247d9xMDsXNSdzQy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-247d9xMDsXNSdzQy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-247d9xMDsXNSdzQy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-247d9xMDsXNSdzQy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-247d9xMDsXNSdzQy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-247d9xMDsXNSdzQy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-247d9xMDsXNSdzQy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-247d9xMDsXNSdzQy .marker.cross{stroke:#333333;}#mermaid-svg-247d9xMDsXNSdzQy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-247d9xMDsXNSdzQy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-247d9xMDsXNSdzQy .cluster-label text{fill:#333;}#mermaid-svg-247d9xMDsXNSdzQy .cluster-label span{color:#333;}#mermaid-svg-247d9xMDsXNSdzQy .label text,#mermaid-svg-247d9xMDsXNSdzQy span{fill:#333;color:#333;}#mermaid-svg-247d9xMDsXNSdzQy .node rect,#mermaid-svg-247d9xMDsXNSdzQy .node circle,#mermaid-svg-247d9xMDsXNSdzQy .node ellipse,#mermaid-svg-247d9xMDsXNSdzQy .node polygon,#mermaid-svg-247d9xMDsXNSdzQy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-247d9xMDsXNSdzQy .node .label{text-align:center;}#mermaid-svg-247d9xMDsXNSdzQy .node.clickable{cursor:pointer;}#mermaid-svg-247d9xMDsXNSdzQy .arrowheadPath{fill:#333333;}#mermaid-svg-247d9xMDsXNSdzQy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-247d9xMDsXNSdzQy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-247d9xMDsXNSdzQy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-247d9xMDsXNSdzQy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-247d9xMDsXNSdzQy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-247d9xMDsXNSdzQy .cluster text{fill:#333;}#mermaid-svg-247d9xMDsXNSdzQy .cluster span{color:#333;}#mermaid-svg-247d9xMDsXNSdzQy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-247d9xMDsXNSdzQy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} fd_set: fd1, fd2, ..., fdN 检查fd1, fd2, ..., fdN 返回结果: fdX, fdY 用户空间 内核空间 内核空间 用户空间 epoll机制 内核维护事件表epoll 通过 epoll_create 创建一个 epoll 实例这个实例在内核中维护一个事件表。这个表记录了所有已经注册的文件描述符及其感兴趣的事件类型。增量更新通过 epoll_ctl用户可以增量地添加、修改或删除文件描述符及其感兴趣的事件。这意味着用户只需要在文件描述符集合发生变化时进行更新而不是每次等待事件时都传递整个集合。事件驱动epoll_wait 返回的不是所有文件描述符的状态而是已经准备好进行 I/O 操作的文件描述符列表。这使得 epoll 在处理大量文件描述符时更加高效因为它只返回有事件的文件描述符。 #mermaid-svg-AsfdJwFPuMChJHKW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .error-icon{fill:#552222;}#mermaid-svg-AsfdJwFPuMChJHKW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AsfdJwFPuMChJHKW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AsfdJwFPuMChJHKW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AsfdJwFPuMChJHKW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AsfdJwFPuMChJHKW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AsfdJwFPuMChJHKW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AsfdJwFPuMChJHKW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AsfdJwFPuMChJHKW .marker.cross{stroke:#333333;}#mermaid-svg-AsfdJwFPuMChJHKW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AsfdJwFPuMChJHKW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .cluster-label text{fill:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .cluster-label span{color:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .label text,#mermaid-svg-AsfdJwFPuMChJHKW span{fill:#333;color:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .node rect,#mermaid-svg-AsfdJwFPuMChJHKW .node circle,#mermaid-svg-AsfdJwFPuMChJHKW .node ellipse,#mermaid-svg-AsfdJwFPuMChJHKW .node polygon,#mermaid-svg-AsfdJwFPuMChJHKW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AsfdJwFPuMChJHKW .node .label{text-align:center;}#mermaid-svg-AsfdJwFPuMChJHKW .node.clickable{cursor:pointer;}#mermaid-svg-AsfdJwFPuMChJHKW .arrowheadPath{fill:#333333;}#mermaid-svg-AsfdJwFPuMChJHKW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AsfdJwFPuMChJHKW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AsfdJwFPuMChJHKW .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-AsfdJwFPuMChJHKW .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-AsfdJwFPuMChJHKW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AsfdJwFPuMChJHKW .cluster text{fill:#333;}#mermaid-svg-AsfdJwFPuMChJHKW .cluster span{color:#333;}#mermaid-svg-AsfdJwFPuMChJHKW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AsfdJwFPuMChJHKW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} epoll_create epoll_ctl: 添加/修改fd epoll_wait 返回有事件的fd 用户空间 内核空间: 事件表 内核空间 用户空间 在 select/poll 中每次都需要将完整的文件描述符集合传递给内核而 epoll 通过维护一个事件表只在有事件发生时通知用户空间从而提高了效率
http://www.w-s-a.com/news/871633/

相关文章:

  • ps中怎样做网站轮播图片吉林省网站建设公司
  • 广西网站建设-好发信息网温江做网站哪家好
  • 网站建设属于什么职位类别南京哪个网站建设比较好
  • wdcp 网站备份东莞网站建设五金建材
  • 天津制作网站的公司电话wordpress架设进出销
  • tomcat做静态网站prestashop和wordpress
  • 上海响应式建站wap网站微信分享代码
  • 四川建筑人才招聘网南昌网站优化
  • 南充网站建设制作重庆有的设计网站大全
  • 深圳沙井做网站公司网站搭建谷歌seo
  • 学校资源网站的建设方案山西省住房城乡建设厅网站
  • 医疗行业网站建设深圳网络科技公司排名
  • 企业形象型网站建设wordpress chess
  • 网站的域名起什么好处罗湖网站建设公司乐云seo
  • 网站的服务器在哪里sem推广软件选哪家
  • 科技网站欣赏婚庆公司经营范围
  • 网站后台管理系统php校园网站建设意见表填写
  • 网站建设问题调查常州百度推广代理公司
  • net网站开发学习谷歌优化培训
  • 企业网站公众号广东网站建设方便
  • 2008r2网站建设张店网站建设方案
  • 企业网站首页学生做的网站成品
  • 网站开发 架构设计企业信息管理系统的组成不包括
  • 网站维护模式网页传奇游戏平台排行
  • 企业网站改自适应蛋糕方案网站建设
  • 网站开发技术职责网站升级中html
  • 天网网站建设百度权重高的网站
  • 明年做哪些网站致富网站站长 感受
  • 东莞营销网站建设优化怎么做微信网站推广
  • 网站建设一个多少钱php网站服务器怎么来