作者回复: 逐个解释一下:
1.FD_ZERO(&allreads);
所有的位置设置为0;
2. FD_SET(0, &allreads);
将描述字0的对应位置设置为1;
3.FD_SET(socket_fd, &allreads);
将监听套接字的对应位置设置为1。
这样就得到了allreads = {0, 3}。
作者回复: 第一个问题,我理解是加不进去的,你不妨设计一个程序验证一下。
第二个问题,首先,这个值是可以调整的,我记得默认值即使1个byte,也就是说有数据就可以感知到;第二,如果一直达不到接收watermark,我理解不是一个正常的网络交互过程,正常的网络交互肯定是像流一样,不断有数据接收。
作者回复: 实际上,只要有一个字节可以被写入,就是状态可写的。
作者回复: 是的,感谢指出。
作者回复: 总结得已经很到位了呀
作者回复: 我明白你想表达的是select之后处理事件的时候可能会阻塞,导致select不到其他事件,这点理解是对的。
至于单线程处理是不是一定没有阻塞(死锁我不太明白这里指的是具体什么情况),我倒觉得不一定,当然,非阻塞效果可能更好一些。
作者回复: 第一,是可以的。这个机制是操作系统实现的,你可以把操作系统理解成一个"巨大"的无限循环处理器,无论是有数据需要读写,还是有新的套接字连接达到,这个巨大的无限循环处理器都是可以快速感知到(通过各种软硬件机制,比如中断),这样你就可以明白,它的内部并不是多线程实现的。
第二,你的理解是正确的,就是对每个位来设置0或者1。
作者回复: 我刚刚回答了。这个时候需要使用管道或者socketpair来做。
作者回复: 是的。
作者回复: 我的意思就是00001001,在bit位上设置为1, 转换为10进制就是9。
作者回复: 是的,应该是a[0]=0,a[1]=0,全部置为0.
作者回复: maxfd表示的是"个数",比如这里{0,1,4},它对应的个数应用是5。就像一个大小为5的数组,每个数组元素的下标分别是{0,1,2,3,4},数组的"个数"是4+1=5。
作者回复: 32位整数,一共有32个bit位,每个bit位可以表示两种状态,0或者1,如果开启检测就将bit设置为1,否则设置为0。像下面这样:
00000000 00000000 00000000 10010010
这个32bit分别表示了描述字7,4和1设置为1,其他的设置为0。这里表示的对应描述字0-31。