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占用率过高。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IO多路复用中的select是一种常见的实现方式,它可以同时监听多个IO事件,一次系统调用就能判断所有IO的可读写状态。select函数的原型为int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptest, struct timeval *timeout)。其中,maxfdp是需要监听的最大文件描述符加1,readsetwriteset和exceptest分别是需要监听的可读、可写和异常事件的文件描述符集合,timeout是超时时间。select函数会阻塞直到有一个或多个文件描述符就绪,或者超过指定的超时时间。然而,select在文件数量庞大、IO流量频繁的情况下性能会下降明显,因此不适合这种场景。\[2\] #### 引用[.reference_title] - *1* *3* [【网络编程】IO 多路复用 select](https://blog.csdn.net/weixin_38333830/article/details/120506096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [IO多路复用之select详解](https://blog.csdn.net/gamekit/article/details/106271528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值