有一个socket程序,最近发现了比较奇怪的问题: 作为服务器端,接受客户端连接后select时出错进程退出,此时errno为EBADF
代码: |
// 设置select IO多工等待时间 select_time.tv_sec = 1; select_time.tv_usec = 0; // 设置select出错等待时间 sleeptime.tv_sec = 1; sleeptime.tv_usec = 0; FD_ZERO(&rfds); FD_SET(port_fd, &rfds); int nfds = port_fd + 1; // I/O multiplexing, waiting for any descriptors to be ready rc = select(nfds, &rfds, NULL, NULL, &select_time); if(rc == -1) { switch(errno) { case EBADF: // 出错后退出 break; case EINTR: continue; ... default: continue; } } |
排查了许久也未找到原因,应该是select的问题,但是select是系统提供的,不是应该比较稳定才对吗?
于是将其换作poll,问题解决。
查看了许多资料,发现介绍几乎一致,此时用poll和用select几乎是完全一样的。
所以,当select出现问题时,不妨试一试poll。