打印本文 打印本文 关闭窗口 关闭窗口
linux 2.6内核epoll用法举例说明(续)--给echo服务器增加读线程池
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2850  更新时间:2009/4/22 23:08:18  文章录入:mintao  责任编辑:mintao
sizeof(serveraddr));

     listen(listenfd, LISTENQ);

    

     maxi = 0;

     for ( ; ; ) {

          //等待epoll事件的发生

          nfds=epoll_wait(epfd,events,20,500);

          //处理所发生的所有事件     

        for(i=0;i<nfds;++i)

        {

               if(events[i].data.fd==listenfd)

               {

                   

                    connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen);

                    if(connfd<0){

                      perror("connfd<0");

                      exit(1);

                   }

                    setnonblocking(connfd);

                   

                    char *str = inet_ntoa(clientaddr.sin_addr);

                    std::cout<<"connec_ from >>"<<str<<std::endl;

                    //设置用于读操作的文件描述符

                    ev.data.fd=connfd;

                    //设置用于注测的读操作事件

                 ev.events=EPOLLIN|EPOLLET;

                    //注册ev

                 epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);

               }

            else if(events[i].events&EPOLLIN)

            {

                    printf("reading!\n");                

                    if ( (sockfd = events[i].data.fd) < 0) continue;

                    new_task=new task();

                    new_task->fd=sockfd;

                    new_task->next=NULL;

                    //添加新的读任务

                    pthread_mutex_lock(&mutex);

                    if(readhead==NULL)

                    {

                      readhead=new_task;

                      readtail=new_task;

                    }   

                    else

                    {   

                     readtail->next=new_task;

                      readtail=new_task;

                    }   

                   //唤醒所有等待cond1条件的线程

                    pthread_cond_broadcast(&cond1);

                    pthread_mutex_unlock(&mutex);  

              }

               else if(events[i].events&EPOLLOUT)

               {   

              rdata=(struct user_data *)events[i].data.ptr;

                 sockfd = rdata->fd;

                 write(sockfd, rdata->line, rdata->n_size);

                 delete rdata;

                 //设置用于读操作的文件描述符

            &

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口