作者回复: 好问题,我收集一下素材。
作者回复: 鼓励动手来一个。
作者回复: POLLIN包括了OOB等带外数据的检测,POLLRDNORM则不包括这部分。
#define POLLIN 0x0001 /* any readable data available */
#define POLLRDNORM 0x0040 /* non-OOB/URG data available */
作者回复: 两者只是编程接口的区别,从内核实现角度来讲,其实本质实现是差不多的,poll客服了select有限文件描述字的缺陷,适用的范围更广一些。
作者回复: 让内核在描述符就绪时发送SIGIO信号通知我们,这种模型为信号驱动式I/O(signal-driven I/O),说实话,这个模型在实战中用的是比较少的,作为一个知识点知道就可以了。
作者回复: poll也是每次向内核注册了一个描述符集合,做法没有区别。你看到的这段代码,就是新增的描述符
//找到一个可以记录该连接套接字的位置
for (i = 1; i < INIT_SIZE; i++) {
if (event_set[i].fd < 0) {
event_set[i].fd = connected_fd;
event_set[i].events = POLLRDNORM;
break;
}
}
作者回复: #define POLLRDNORM 0x0040 /* non-OOB/URG data available */
#define POLLIN 0x0001 /* any readable data available */
作者回复: 你这样理解倒也是可以的。一个描述字可以对应三种不同的事件。
作者回复: Linux下"man xxx",windows下看MSDN,当然,有一些常见的是要记下来的。
作者回复: 你是在什么上下文理听过这个问题的呢?
作者回复: 谢谢支持~。
作者回复: poll也一样的,
poll(event_set, INIT_SIZE, -1)),这个event_set就是每次轮询的事件全集。
作者回复: 区别是编程的接口不一样,原理基本一致,但是select一般来说有文件句柄的现在,poll则没有。我觉得你可以看代码体会一下。
作者回复: https://github.com/froghui/yolanda
作者回复: 63829,63851,63851就是三个不同的telnet客户端连接端口,由此断定肯定是三个不同的连接套接字。
作者回复: 场景不同,select仍然活跃在各种场合。
作者回复: 你是说使用阻塞I/O配合poll来使用?