当前位置: 技术问答>linux和unix
select 的writeset不懂。
来源: 互联网 发布时间:2016-02-18
本文导语: 网络编程select函数的第三个参数有点不懂,请大家解释以下。 select的第三个参数是 侦听对写事件感兴趣的fd集合。 什么情况下写事件集合中的fd被置?书上说是在内核中的发送缓冲区中有数据时,就表示可写,但还...
网络编程select函数的第三个参数有点不懂,请大家解释以下。
select的第三个参数是 侦听对写事件感兴趣的fd集合。 什么情况下写事件集合中的fd被置?书上说是在内核中的发送缓冲区中有数据时,就表示可写,但还是不明白。
一般对写事件的操作如下
我不解的是,如果在select之没调用send函数,select怎么知道fd的写已被置1,如果fd不置1,FD_ISSET就返回0,那么send函数就没法调用。 我知道这里的buf不是指内核中的发送缓冲区,但还是想不同其中的原由。好像见到的程序都是这么写的。
请大家解释以下。
select的第三个参数是 侦听对写事件感兴趣的fd集合。 什么情况下写事件集合中的fd被置?书上说是在内核中的发送缓冲区中有数据时,就表示可写,但还是不明白。
一般对写事件的操作如下
ioctl(fd, FIONBIO, 1);//设置为非阻塞。
FD_SET(fd, &writeset);
ret = select(maxfd+1, &readset, &writeset, NULL, NULL);
if(ret > 0)
{
if(FD_ISSET(fd, &writeset))
{
send(fd, buf, strlen(buf), 0);//之前没有调用过send函数
}
}
我不解的是,如果在select之没调用send函数,select怎么知道fd的写已被置1,如果fd不置1,FD_ISSET就返回0,那么send函数就没法调用。 我知道这里的buf不是指内核中的发送缓冲区,但还是想不同其中的原由。好像见到的程序都是这么写的。
请大家解释以下。
|
在Linux下是否可写是由设备驱动完全决定的,就算你不调用send或者write,writeset也可能是置位的。其实,大多数设备都是置位的。大多数设备驱动根据设备情况和缓冲情况返回POLLOUT,导致writeset返回1。windows的语意是输出直到写入部分数据才等待。所以,在Linux下,异步写需要格外的小心,否则会导致select失效,cpu占用率过高。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。