




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绥化市中医医院招聘模拟试卷及1套参考答案详解
- 2025黑龙江哈尔滨市五常市万宝学校9大岗位招聘28人模拟试卷及完整答案详解一套
- 2025年甘肃交通职业技术学院招聘工作人员考前自测高频考点模拟试题及参考答案详解
- 浙江国企招聘2025浙江省低空产业发展有限公司招聘笔试历年参考题库附带答案详解
- 四川川藏工业园区发展有限责任公司公开招聘人选笔试历年参考题库附带答案详解
- 九江市赣北劳动保障事务代理所公开招聘劳务派遣工笔试历年参考题库附带答案详解
- 2025恒邦财产保险股份有限公司营业部招聘1人模拟试卷及答案详解(夺冠系列)
- 2025重庆江跳线轨道交通运营管理有限公司社会招聘笔试历年参考题库附带答案详解
- 2025重庆城市职业学院劳务派遣招聘笔试历年参考题库附带答案详解
- 2025贵州航空产业城集团股份有限公司旗下子公司贵州安立航空材料有限公司社会招聘及笔试历年参考题库附带答案详解
- 新学期新起点励志奋斗青春初三毕业班开学第一课主题班会课件
- 分包单位与班组签订合同
- 盐酸右美托咪定鼻喷雾剂-临床用药解读
- 危险货物装载与卸载操作规程
- 《映山红》PPT课件(安徽省市级优课)-五年级音乐课件
- 林则徐课件完整版
- 投资学英文版课件Ch 3 Securities markets
- 氟喹诺酮类药物残留的检测课件
- 全国编辑记者资格证考试复习资料
- 高速公路路政巡查记录表
- 分光光度法分析磷原始记录表
评论
0/150
提交评论