linux 2.6内核epoll用法举例

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析 本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。 阅读详情
 
  1. linux 2.6内核epoll用法举例说明(续)--给echo服务器增加读线程池
  2. 上篇文章使用linux内核2.6 提供的epoll机制实现了一个反应式echo服务器,使用反应式服务器的最大好处就是可以按cpu的数量来配置线程池内线程的线程数而不是根据客户端的并发量配置线程池。我是第一次使用pthread库来写线程池,使用的是工作队列方式的线程池。我感觉作队列方式的线程池可以当成一种设计模式来用的,在很多平台上都是可以按这种方式来实现线程池,从win32 ,unix到jvm都是适用的
  3.  
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13.  
  14. #define MAXLINE 10
  15. #define OPEN_MAX 100
  16. #define LISTENQ 20
  17. #define SERV_PORT 5555
  18. #define INFTIM 1000
  19.  
  20. //线程池任务队列结构体
  21. struct task{
  22.   int fd;            //需要读写的文件描述符
  23.   struct task *next; //下一个任务
  24. };
  25.  
  26. //用于读写两个的两个方面传递参数
  27. struct user_data{
  28.   int fd;
  29.   unsigned int n_size;
  30.   char line[MAXLINE];
  31. };
  32.  
  33. //线程的任务函数
  34. void * readtask(void *args);
  35. void * writetask(void *args);
  36.  
  37.  
  38. //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
  39. struct epoll_event ev,events[20];
  40. int epfd;
  41. pthread_mutex_t mutex;
  42. pthread_cond_t cond1;
  43. struct task *readhead=NULL,*readtail=NULL,*writehead=NULL;
  44.  
  45. void setnonblocking(int sock)
  46. {
  47.      int opts;
  48.      opts=fcntl(sock,F_GETFL);
  49.      if(opts<0)
  50.      {
  51.           perror("fcntl(sock,GETFL)");
  52.           exit(1);
  53.      }
  54.     opts = opts|O_NONBLOCK;
  55.      if(fcntl(sock,F_SETFL,opts)<0)
  56.      {
  57.           perror("fcntl(sock,SETFL,opts)");
  58.           exit(1);
  59.      }   
  60. }
  61.  
  62. int main()
  63. {
  64.      int i, maxi, listenfd, connfd, sockfd,nfds;
  65.      pthread_t tid1,tid2;
  66.     
  67.      struct task *new_task=NULL;
  68.      struct user_data *rdata=NULL;
  69.      socklen_t clilen;
  70.     
  71.      pthread_mutex_init(&mutex,NULL);
  72.      pthread_cond_init(&cond1,NULL);
  73.      //初始化用于读线程池的线程
  74.      pthread_create(&tid1,NULL,readtask,NULL);
  75.      pthread_create(&tid2,NULL,readtask,NULL);
  76.     
  77.      //生成用于处理accept的epoll专用的文件描述符   
  78.      epfd=epoll_create(256);
  79.  
  80.      struct sockaddr_in clientaddr;
  81.      struct sockaddr_in serveraddr;
  82.      listenfd = socket(AF_INET, SOCK_STREAM, 0);
  83.      //把socket设置为非阻塞方式
  84.      setnonblocking(listenfd);
  85.      //设置与要处理的事件相关的文件描述符
  86.      ev.data.fd=listenfd;
  87.      //设置要处理的事件类型
  88.      ev.events=EPOLLIN|EPOLLET;
  89.      //注册epoll事件
  90.      epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);
  91.     
  92.      bzero(&serveraddr, sizeof(serveraddr));
  93.      serveraddr.sin_family = AF_INET;
  94.     
  95.      char *local_addr="200.200.200.222";
  96.      inet_aton(local_addr,&(serveraddr.sin_addr));//htons(SERV_PORT);
  97.      serveraddr.sin_port=htons(SERV_PORT);
  98.      bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));
  99.      listen(listenfd, LISTENQ);
  100.     
  101.      maxi = 0;
  102.      for ( ; ; ) {
  103.           //等待epoll事件的发生
  104.           nfds=epoll_wait(epfd,events,20,500);
  105.           //处理所发生的所有事件     
  106.         for(i=0;i
  107.         {
  108.                if(events[i].data.fd==listenfd)
  109.                {
  110.                    
  111.                     connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen);
  112.                     if(connfd<0){
  113.                       perror("connfd<0");
  114.                       exit(1);
  115.                    }
  116.                     setnonblocking(connfd);
  117.                    
  118.                     char *str = inet_ntoa(clientaddr.sin_addr);
  119.                     std::cout<<"connec_ from >>"<
  120.                     //设置用于读操作的文件描述符
  121.                     ev.data.fd=connfd;
  122.                     //设置用于注测的读操作事件
  123.                  ev.events=EPOLLIN|EPOLLET;
  124.                     //注册ev
  125.                  epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
  126.                }
  127.             else if(events[i].events&EPOLLIN)
  128.             {
  129.                     printf("reading!/n");                
  130.                     if ( (sockfd = events[i].data.fd) < 0) continue;
  131.                     new_task=new task();
  132.                     new_task->fd=sockfd;
  133.                     new_task->next=NULL;
  134.                     //添加新的读任务
  135.                     pthread_mutex_lock(&mutex);
  136.                     if(readhead==NULL)
  137.                     {
  138.                       readhead=new_task;
  139.                       readtail=new_task;
  140.                     }   
  141.                     else
  142.                     {   
  143.                      readtail->next=new_task;
  144.                       readtail=new_task;
  145.                     }   
  146.                    //唤醒所有等待cond1条件的线程
  147.                     pthread_cond_broadcast(&cond1);
  148.                     pthread_mutex_unlock(&mutex);  
  149.               }
  150.                else if(events[i].events&EPOLLOUT)
  151.                {   
  152.               rdata=(struct user_data *)events[i].data.ptr;
  153.                  sockfd = rdata->fd;
  154.                  write(sockfd, rdata->line, rdata->n_size);
  155.                  delete rdata;
  156.                  //设置用于读操作的文件描述符
  157.                  ev.data.fd=sockfd;
  158.                  //设置用于注测的读操作事件
  159.                ev.events=EPOLLIN|EPOLLET;
  160.                  //修改sockfd上要处理的事件为EPOLIN
  161.                epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
  162.                }
  163.                              
  164.           }
  165.          
  166.      }
  167. }
  168. void * readtask(void *args)
  169. {
  170.    
  171.    int fd=-1;
  172.    unsigned int n;
  173.    //用于把读出来的数据传递出去
  174.    struct user_data *data = NULL;
  175.    while(1){
  176.         
  177.         pthread_mutex_lock(&mutex);
  178.         //等待到任务队列不为空
  179.         while(readhead==NULL)
  180.              pthread_cond_wait(&cond1,&mutex);
  181.         
  182.         fd=readhead->fd;
  183.         //从任务队列取出一个读任务
  184.         struct task *tmp=readhead;
  185.         readhead = readhead->next;
  186.         delete tmp;
  187.         pthread_mutex_unlock(&mutex);
  188.         data = new user_data();
  189.         data->fd=fd;
  190.         if ( (n = read(fd, data->line, MAXLINE)) < 0) {
  191.            
  192.            if (errno == ECONNRESET) {
  193.              close(fd);
  194.              
  195.           } else
  196.              std::cout<<"readline error"<
  197.            if(data!=NULL)delete data;
  198.         } else if (n == 0) {
  199.             close(fd);
  200.            printf("Client close connect!/n");
  201.            if(data!=NULL)delete data;
  202.         } else{
  203.         
  204.         data->n_size=n;
  205.         //设置需要传递出去的数据
  206.         ev.data.ptr=data;
  207.         //设置用于注测的写操作事件
  208.         ev.events=EPOLLOUT|EPOLLET;
  209.         //修改sockfd上要处理的事件为EPOLLOUT
  210.         epoll_ctl(epfd,EPOLL_CTL_MOD,fd,&ev);
  211.        }
  212.    }
  213. }
Open3D 实现CSF布料模拟算法【2025最新版】 CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。 阅读详情

相关推荐

逆向分析TikTok的Cronet网络库:定位libsscronet.so并Hook关键SSL函数

本文深入探讨了逆向分析TikTok的Cronet网络库的技术细节,重点介绍了如何定位libsscronet.so并Hook关键SSL函数。通过Java到Native的调用链路追踪、So库定位策略和SSL验证函数的动态Hook技巧,帮助开发者突破定制化网络库的协议加密防护,实现流量解密和协议分析。

weixin_27875131的博客 969

epoll哪些触发模式_网络编程:epoll

前言前面讲了IO多路复用的API,select和poll的缺点是性能不够,客户端连接越多性能下降越明显,epoll的出现解决了这个问题,引用The Linux Programming Interface的一个统计对比如下:fd数量 poll CPU时间(秒) select CPU时间(秒) epoll CPU时间(秒) -----------------------------...

weixin_39653078的博客 440

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

epoll编程实例客户端_Python epoll网络编程二:客户端模型

Python epoll网络编程二:客户端模型第一篇简单介绍了一个使用epoll的服务器模型,本节介绍使用epoll的客户端模型,客户端连接多个服务器。以下是发送hello请求的客户端,可以作为探测程序,探测服务器的工作状态,如果返回greeting,表示服务器正常工作。代码如下:文件:epoll_python.zip大小:2KB下载:def usage():print 'python epoll...

weixin_33765530的博客 589

[面试]SoC验证工程师面试常见问题(三)

SoC 验证工程师面试中,SystemVerilog、UVM 和 SystemC 的代码题目通常涵盖面向对象编程、约束随机化、UVM 组件设计、内存建模等主题。通过练习上述示例题目和理解关键点,你可以更好地应对现场编码环节。如果有具体的面试方向(如特定协议验证)或公司偏好,可以提供更多信息,我会进一步定制题目和答案。祝你面试顺利!

元直的博客 1614

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

epoll_实现服务器客户端通信

【代码】epoll_实现服务器客户端通信。

lsw2604190117的博客 180

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 467

linux上的epoll如何使用,并用C++实现多客户端服务器

是Linux系统中的一种高效的I/O多路复用机制,可以用于实现高并发的网络服务器。的代码相对复杂,需要理解非阻塞I/O、事件驱动编程等概念。实现多客户端服务器的基本步骤,需要注意的是,

CHNIM的博客 913

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3983

Vue - 萤石云监控 ezuikit 视频实例销毁方案,解决使用stop方法无法销毁EZUIKit实例或销毁后依然占用内存并且监控画面依然有声音问题(解决页面多个监控摄像头画面同时播放,翻页或关闭页

vue2,vue3,萤石,监控摄像头,萤石云销毁视频实例,退出页面销毁,stop销毁原视频流,占用内存怎么办,销毁后视频依旧在后台播放有声音,销毁视频播放器,页面上有多个视频画面怎么销毁某一个,stop方法不生效怎么办,浏览器非常卡,dom销毁,ezuikit-js萤石云播放器Vue中使用beforeDestory销毁播放器实例,调用萤石云ezuikit-js的视频对象销毁,vue使用萤石云监控视频录像回放,不销毁实例会出现离开页面后依旧有监控声音并且占内存问题,不好使,页面崩了,崩溃,视频监控太多,没有用

🏆 前端领域优质创作者 1万+

socket创建失败_linux下socket采用epoll编程demo

首先,需要调用epoll_create创建epoll; 此后我们就可以进行socket/bind/listen; 然后调用epoll_ctl进行注册; 接下来,就可以通过一个while(1)循环调用epoll_wait来等待事件的发生; 然后循环查看接收到的事件并进行处理; 1)如果事件是sever的socketfd我们就要进行accept,并且把接收到client的socketfd加入到要监听的...

weixin_39631467的博客 277

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux 2.6内核epoll用法举例说明

linux 2.6内核epoll用法举例说明(zz from www.csdn.net)epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数:所用到的数据结构typedef union epoll_data {                void *ptr;                int fd;                __uin

2087

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

linux2.6内核epoll用法举例说明

linux2.6内核epoll用法举例说明http://blog.csdn.net/hwz119/archive/2007/03/22/1537553.aspx epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数:所用到的数据结构typedef union epoll_data {void *ptr;int fd;__uint32_t

StamHe的专栏 669

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux 2.6 内核Epoll用法举例说明

epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数: 所用到的数据结构:  typedef union epoll_data { void *ptr; int fd; __uint32_t u32;

popotang 1035

linux2.6内核epoll用法举例说明zz

350

linux 2.6内核epoll用法举例说明(续)

linux 2.6内核epoll用法举例说明(续)http://blog.csdn.net/hwz119/archive/2007/06/07/1643134.aspx 上篇文章使用linux内核2.6提供的epoll机制实现了一个反应式echo服务器,使用反应式服务器的最大好处就是可以按cpu的数量来配置线程池内线程的线程数而不是根据客户端的并发量配置线程池。我是第一次使用pthre

StamHe的专栏 590
上一篇: spinlock理解
下一篇: Linux内核中的同步机制
guowake
博客等级 码龄19年 62粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值