关于linux下select函数的使用


最近在做一个项目,需要一个服务器能同时为多个客户端服务,我们使用socket,同时,为了提高效率,服务器端也使用多线程的方式来为多个客户服务。
在网上找了很久,发现了一个select()的函数,然后我就想问一下,比如select(maxfd,&readfd,&writefd,NULL,NULL)
然后比如一个文件描述符fd读就绪后,函数返回,然后用FD_ISSET()来判断是不是读就绪,然后把数据读取进来,
然后,这时我想再向客户端发送数据,那这时候能直接用FD——ISSET()来判断是否可写吗?还是需要重新select()?如果用select的话,还得重新初始化FD_SET,再向里面填充文件描述符啊?

Linux socket

家具屋辉夜 10 years, 6 months ago

如果没有其他线程在读写,那用FD_ISSET连续检查是可以的,最坏的情况就是fd实际可以被不阻塞写,而FD_ISSET告诉你会阻塞,要等下次select才能发送。

再次select时要重新设置文件描述符,因为select会修改传给它的fd_set。简单的做法是额外维护一个fd_set,重新初始化时用memcpy直接复制。

epoll效率比select高。

男主角的死党 answered 10 years, 6 months ago

Your Answer