【发布时间】:2012-02-23 03:04:48
【问题描述】:
所以当有人使用 select() 向我展示一些代码时,我完全失去了它:
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
FD_SET(0,&readfds);
.......// bind() and listen(),regular stuff
// Before select(),this guy cleared readfds to null and sort of start all over again
FD_ZERO(&readfds);// Behold,this is exactly the line confusing myself
FD_SET(socket,&readfds);
// select will be called in the future within a infinite loop
所以基本上说在bind和listen之后FD_ZERO是出于某种原因清除以前的内容并再次将套接字文件描述符插入fd set。同时,在fd set中,0描述符(标准输入)显然消失了。
谁能解释这整个事情?我不觉得这是正确的,但我真的无法弄清楚。也许重新设置一些特定的 fd 集是一种实用的机制......
我认为bind() 和listen() 可以以某种方式修改 fd set。我设置了几个断点并检查了输出。因此,fd set 根本没有改变。
更新:
真正让我困惑的是第二个FD_ZERO(&readfds)。
显然,第一个就像清除缓冲区中生锈的东西。在每次迭代中,我们必须将 fdset 清除为未来的默认值。我只是不明白第二个。要么是错误的,要么无论如何都不会受到伤害。
【问题讨论】:
-
select将更改 fdset,但bind和listen不能,他们甚至没有得到指向它的指针。但请帮自己一个忙,使用像poll或epoll这样的现代 API,再也不用担心 fdset。 -
听起来很酷,但我就是受不了
-
使用
poll。它是现代的、便携的和快速的。epoll仅用于自我愉悦的基准测试,它擅长的基准测试并不符合大多数实际使用需求(其中epoll实际上比poll慢得多)。