资源描述:
《多进程服务器中epoll实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、多进程服务器中,epoll的创建应该在创建子进程之后看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epollfd之前,一个在之后,在调用在创建之前的代码会出问题,在我的机器上(linux内核2.6.26)表现的症状就是所有进程的epoll_wait函数返回0,而客户端似乎被阻塞了:服务器端:#include #include #include #include <
2、netinet/in.h>#include #include #include #include #include #include #include using namespace std;#define MAXLINE 5#define OPEN_MAX 100#define LISTENQ 20#define SERV_PORT 5000#define INFTIM 1000typedef
3、struct task_t{ int fd; char buffer[100]; int n;}task_t;int CreateWorker(int nWorker){ if (0 < nWorker) { bool bIsChild; pid_t nPid; while (!bIsChild) { if (0 < nWorker) { nPid = ::fork();
4、 if (nPid > 0) { bIsChild = false; --nWorker; } else if (0 == nPid) { bIsChild = true; printf("create worker %d success!", ::getpi
5、d()); } else { printf("fork error: %s", ::strerror(errno)); return -1; } } else { int nStatus; if (-1 == ::wait
6、(&nStatus)) { ++nWorker; } } } } return 0;}void setnonblocking(int sock){ int opts; opts=fcntl(sock,F_GETFL); if(opts<0) { perror("fcntl(sock,GETFL)"); exit(1); } opts =
7、opts
8、O_NONBLOCK; if(fcntl(sock,F_SETFL,opts)<0) { perror("fcntl(sock,SETFL,opts)"); exit(1); } }int main(){ int i, maxi, listenfd, connfd, sockfd,epfd,nfds; ssize_t n; char line[MAXLINE]; socklen_t clilen; struct epoll_event ev,events[
9、20]; struct sockaddr_in clientaddr; struct sockaddr_in serveraddr;