一个关于POLL的BUG,百思不得其解

背景

系统:ubuntu 16.04 server 64bit
该问题出现在HTTP流媒体服务器中,流媒体服务器一直监听服务SOCKECT,当有新的连接时,则读取请求内容,并根据请求内容作出相应回复。
问题是当客户端FD为1087,客户端连接数到达1044时服务器会异常退出,百思不得其解。

出错打印

出错打印使用GDB调试,也不能追踪到具体行数,看起来信息也是很奇怪

*** stack smashing detected ***: /usr/local/bin/mscore terminated

Thread 6 "dohrserver" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff1ac6700 (LWP 7772)]
0x00007ffff3c55428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

出错地方

经过多次调试终于定位到问题出现在poll函数接口,但原理一直没想明白!!!

int ff_network_wait_fd_timeout(int fd, int write,int retrytime)
{
    int ev = write ? POLLOUT : POLLIN;
    struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
    int ret=0;
    do{
        ret = poll(&p, 1, 100);/*100ms*/
        if(ret!=0)
            break;/*fd ready or errors*/
    }while(retrytime-->0);

    if(!(retrytime>0)){
        ret=-1;
    }
    return ret ;
}
发布了91 篇原创文章 · 获赞 28 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/weixin_35804181/article/details/78130006