




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多进程服务器中,epoll的创建应该在创建子进程之后 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码会出问题,在我的机器上(linux内核2.6.26)表现的症状就是所有进程的epoll_wait函数返回0, 而客户端似乎被阻塞了:服务器端:#include#include#include#include#include#include#include#include#include#include#includeusingnamespacestd;#defineMAXLINE5#defineOPEN_MAX100#defineLISTENQ20#defineSERV_PORT5000#defineINFTIM1000typedefstructtask_tintfd;charbuffer100;intn;task_t;intCreateWorker(intnWorker)if(0nWorker)boolbIsChild;pid_tnPid;while(!bIsChild)if(00)bIsChild=false;-nWorker;elseif(0=nPid)bIsChild=true;printf(createworker%dsuccess!n,:getpid();elseprintf(forkerror:%sn,:strerror(errno);return-1;elseintnStatus;if(-1=:wait(&nStatus)+nWorker;return0;voidsetnonblocking(intsock)intopts;opts=fcntl(sock,F_GETFL);if(opts0)perror(fcntl(sock,GETFL);exit(1);opts=opts|O_NONBLOCK;if(fcntl(sock,F_SETFL,opts)0)perror(fcntl(sock,SETFL,opts);exit(1);intmain()inti,maxi,listenfd,connfd,sockfd,epfd,nfds;ssize_tn;charlineMAXLINE;socklen_tclilen;structepoll_eventev,events20;structsockaddr_inclientaddr;structsockaddr_inserveraddr;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&serveraddr,sizeof(serveraddr);serveraddr.sin_family=AF_INET;char*local_addr=;inet_aton(local_addr,&(serveraddr.sin_addr);/htons(SERV_PORT);serveraddr.sin_port=htons(SERV_PORT);/地址重用intnOptVal=1;socklen_tnOptLen=sizeof(int);if(-1=:setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&nOptVal,nOptLen)return-1;setnonblocking(listenfd);bind(listenfd,(sockaddr*)&serveraddr,sizeof(serveraddr);listen(listenfd,LISTENQ);CreateWorker(5);/把socket设置为非阻塞方式/生成用于处理accept的epoll专用的文件描述符epfd=epoll_create(256);/设置与要处理的事件相关的文件描述符ev.data.fd=listenfd;/设置要处理的事件类型ev.events=EPOLLIN|EPOLLET;/ev.events=EPOLLIN;/注册epoll事件epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);/CreateWorker(5);maxi=0;task_ttask;task_t*ptask;while(true)/等待epoll事件的发生nfds=epoll_wait(epfd,events,20,500);/处理所发生的所有事件for(i=0;infds;+i)if(eventsi.data.fd=listenfd)connfd=accept(listenfd,NULL,NULL);if(connfd0)printf(connfd0,listenfd=%dn,listenfd);printf(error=%sn,strerror(errno);exit(1);setnonblocking(connfd);/设置用于读操作的文件描述符memset(&task,0,sizeof(task);task.fd=connfd;ev.data.ptr=&task;/设置用于注册的读操作事件ev.events=EPOLLIN|EPOLLET;/ev.events=EPOLLIN;/注册evepoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);elseif(eventsi.events&EPOLLIN)coutEPOLLINfd;if(ptask-n=read(sockfd,ptask-buffer,100)0)if(errno=ECONNRESET)close(sockfd);eventsi.data.ptr=NULL;elsestd:coutreadlineerrorn=0)close(sockfd);eventsi.data.ptr=NULL;ptask-bufferptask-n=0;coutreadbufferendl;/设置用于写操作的文件描述符ev.data.ptr=ptask;/设置用于注测的写操作事件ev.events=EPOLLOUT|EPOLLET;/修改sockfd上要处理的事件为EPOLLOUTepoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);elseif(eventsi.events&EPOLLOUT)coutEPOLLOUTfd;write(sockfd,ptask-buffer,ptask-n);/设置用于读操作的文件描述符ev.data.ptr=ptask;/修改sockfd上要处理的事件为EPOLINepoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,&ev);coutwritebuffer;memset(ptask,0,sizeof(*ptask);close(sockfd);return0;测试客户端:#!/usr/bin/perlusestrict;useSocket;useIO:Handle;subechoclientmy$host=;my$port=5000;my$protocol=getprotobyname(TCP);$host=inet_aton($host);socket(SOCK,AF_INET,SOCK_STREAM,$protocol)ordiesocket()failed:$!;my$dest_addr=sockaddr_in($port,$host);connect(SOCK,$dest_addr)ordieconnect()failed:$!;SOCK-autoflush(1);my$msg_out=helloworldn;printout=,$msg_out;printSOCK$msg_out;my$msg_in=;printin=,$msg_in;closeSOCK;#&echoclient;#exit(0);for(my$i=0;$i9999;$i+)echoclient;我查看了lighttpd的实现,也是在创建完子进程之后才创建的epoll的fd.请问谁知道哪里有讲解这个的文档?这是美丽的分割线:-感谢luke, 他帮我解释了这个问题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60672-3:1997 FR-D Ceramic and glass-insulating materials - Part 3: Specifications for individual materials
- 【正版授权】 ISO/IEC GUIDE 51:2014 FR Safety aspects - Guidelines for their inclusion in standards
- 引力理论考试试题及答案
- 艺术修复考试试题及答案
- 医院考试考试试题及答案
- 六一公司活动方案
- 六一助学活动方案
- 六一宠物活动方案
- 六一武术活动方案
- 六一活动及端午活动方案
- 2024年《中央经济工作会议》重要试题及答案
- 2019特高压换流站分系统调试规范第3部分:换流变分系统调试
- 绿色建筑工程监理实施细则
- 《积极心理学(第3版)》 课件 第11章 宽容
- 陕西省西安市数学中考2024年试题及答案解析
- DB37T 1914-2024 液氨存储与装卸作业安全技术规范
- 国家开放大学本科《理工英语4》一平台机考第二大题词汇与结构总题库
- 国际法(第七版) 课件 第九章 外交和领事关系法
- 2024年哈尔滨铁道职业技术学院单招职业适应性测试题库各版本
- 水表检定记录全册
- DG-TJ08-2411-2023 地下结构隔排水主动抗浮技术标准
评论
0/150
提交评论