IO多路复用

在使用select函数进行I/O多路复用时,FD_SET()宏的作用是向一个fd_set类型的文件描述符集合中添加你感兴趣的文件描述符。这个操作非常重要,因为select函数正是基于这个集合来监控哪些文件描述符已经准备好进行读、写或异常处理的。

当你调用select时,它会检查fd_set集合中所有的文件描述符,看它们是否满足你设定的条件(例如是否可读、可写或有异常)。如果没有文件描述符准备好,select会阻塞,直到至少有一个文件描述符准备好或超时。

FD_SET()FD_CLR()FD_ISSET()FD_ZERO()这一系列宏是用来操作fd_set集合的:

  • FD_ZERO(fd_set *set):清空集合,将所有位设置为0,表示集合中没有任何文件描述符。
  • FD_SET(int fd, fd_set *set):将指定的文件描述符fd添加到集合set中。
  • FD_CLR(int fd, fd_set *set):从集合set中移除指定的文件描述符fd
  • FD_ISSET(int fd, const fd_set *set):检查文件描述符fd是否在集合set中,如果在则返回非零值,否则返回0。

当你调用select后,select会返回一个整数值,表示集合中有多少个文件描述符已经准备好。这个数字不一定等于你最初放入集合中的文件描述符总数,因为它只表示那些状态发生变化的描述符数量。你可以通过再次使用FD_ISSET()宏来检查哪些具体的文件描述符已经准备好了。

例如,如果你有三个文件描述符fd1fd2fd3,并且你只对fd1fd2感兴趣,那么你应该只用FD_SET()fd1fd2添加到集合中。当select返回时,即使fd3也准备好了,但因为你没有监控它,select不会报告它的状态变化。

简而言之,FD_SET()用于指定你关心的文件描述符,而select函数基于这个集合来检测这些描述符的状态变化,返回准备好的描述符数量,以及通过修改集合来指示哪些描述符已经准备好。这使得select能够有效地监控多个文件描述符,而无需为每个描述符创建独立的线程或进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值