日期:2014-05-16  浏览次数:20949 次

求助啊,为何我的epoll_wait(epfd, events, 20, -1)总是返回0
为何我的epoll_wait(epfd, events, 20, -1)每次有连接时就返回0,就算后面的-1改为其它数字也一样呢?用的是域套接字,求解,上源码
if((cgi_fd = socket(PF_UNIX,SOCK_STREAM,0))<0) //域套接字的socket
{
perror("TCP cgi socket");
exit(-1);
}
setnonblocking(cgi_fd);
struct epoll_event ev,events[20];
int epfd=epoll_create1(0);
if(-1==epfd)
{
perror("epoll_create1 error");
exit(-1);
}
ev.data.fd=cgi_fd;
ev.events=EPOLLIN|EPOLLET;
if(epoll_ctl(epfd, EPOLL_CTL_ADD, cgi_fd, &ev)<0)
{
perror("epoll_ctl error");
exit(-1);
}
unlink(UNIX_PATH); //删除原有套接字连接

memset(&cgi_addr,0,sizeof(cgi_addr));
cgi_addr.sun_family = AF_UNIX;
strcpy(cgi_addr.sun_path, UNIX_PATH);

if(bind(cgi_fd, (struct sockaddr *)&cgi_addr, sizeof(struct sockaddr_un))<0)
{
perror("TCP cgi bind");
exit(-1);
}

if(listen(cgi_fd, MAX_CGI_LINK)<0)
{
perror("TCP cgi listen");
exit(-1);
}
int nfds=-1,num=1;
for(;;)
{
#ifdef LINUX
if(nfds=epoll_wait(epfd,events,num,-1)<0)    //一有连接就返回0
{
perror("epoll_wait error");
exit(-1);
}

for(i=0;i<nfds;++i)
{
if(events[i].data.fd==cgi_fd)
{
if((new_fd=accept(cgi_fd, NULL, NULL))<0)
{
perror("TCP cgi accept");

//重建CGI域套接字
if((cgi_fd = socket(PF_UNIX,SOCK_STREAM,0))<0) //域套接字的socket
{
perror("TCP cgi resocket");
break;
}

setnonblocking(cgi_fd);

unlink(UNIX_PATH); //删除原有套接字连接

memset(&cgi_addr,0,sizeof(cgi_addr));
cgi_addr.sun_family = AF_UNIX;
strcpy(cgi_addr.sun_path, UNIX_PATH);

if(bind(cgi_fd, (struct sockaddr *)&cgi_addr, sizeof(struct sockaddr_un))<0)
{
perror("TCP cgi rebind");
break;
}

if(listen(cgi_fd, MAX_CGI_LINK)<0)
{
perror("TCP cgi relisten");
break;
}
continue;
}
//printf("new connecting new_fd=%d\n",new_fd);

setnonblocking(new_fd);

ev.data.fd=new_fd;
ev.events=EPOLLIN|EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, new_fd, &ev);
num++;
}
else if(events[i].events & EPOLLIN)
{
if(events[i].data.fd<0)
continue;
pthread_t tid;
if(pthread_create(&tid,NULL,(void*)CGI_Link,(void*)(&events[i].data.fd))<0)
{
perror("pthread_create epoll");
close(events[i].data.fd);
}
epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, &ev);
num--;
//events[i].data.fd=-1;
}
else if(events[i].events&EPOLLOUT)
{
//异步发送,这里用不到
}
}
------解决方案--------------------
我猜测,可能epoll对本地文件有bug,unix socket是本地文件。等大牛。
------解决方案--------------------
这句代码少了个括号吧:if(nfds=epoll_wait(epfd,events,num,-1)<0)  

正确是:

if( (nfds=epoll_wait(epfd,events,num,-1) )<0)