select 的writeset不懂

http://www.169it.com/tech-qa-linux/article-12541001634786252923.html

网络编程select函数的第三个参数有点不懂,请大家解释以下。
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占用率过高。

猜你喜欢

转载自blog.csdn.net/wojiuguowei/article/details/82798120