Linux-关于linux下select函数的使用

发布于 2017-10-17 16:33:53 字数 335 浏览 1143 评论 1

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜柠檬 2017-10-20 10:58:49

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

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

epoll效率比select高。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文