第六章:I/O复用:select和poll函数

第六章I/O复用:select和poll函数

1 unix提供给我们的五种IO模型:

阻塞I/O模型:阻塞I/O例如函数recvfrom的内核到应用层、应用层到内核的调用过程是这样的:首先把描述符、接受数据缓冲地址、大小传递给内核,但是如果此时该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡在这里,当数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图:

非阻塞I/O模型:就是如果recvfrom从应用层到内核的时候,此时与传进来的套接字相应的缓冲区还没有数据的时候,这个时候就告诉内核,如果该缓冲区没有数据的话,就直接给我返回,并且返回一个错误是EWOULDBLOCK,一般都对非阻塞I/O模型进行轮询,就是一直在检查这个状态,看内核是不是有数据到来调用过程如下图


I/O复用模型:就是设置一组套接字,如果这些套接字有一个以上出现了可读、可写、或者异常select都会返回,这个时候,可以检查室哪个套接字状态达到了,因为select函数的套接字集是 值=结果的,当select返回的时候,集合中的套接字是变化的,这个返回的套接字是满足要求的,通常程序的做法是,对想要了解的套接字,进行分开处理

使用select的好处是:能够等待多个套接字准备好。


信号驱动I/O模型:当内核为我们准备好数据的时候,就会发送SIGIO信号,我们可以调用sigaction安装SIGIO信号的处理函数,这个时候就可以在SIGIO信号处理函数中进行recvfrom函数来接受数据报


异步I/O模型:是让内核拷贝完之后通知我们。信号驱动I/O是当内核准备好数据的时候,通知我们可以调用recvfrom了,而异步I/O模型是内核通知我们I/O操作完成的时候通知我们。


select函数:这个函数允许指示内核等待多个事件中的人一个发生,并仅在一个或多个事件发生或者经过某指定事件后在唤醒进程。

intselect(int maxfd1, fd_set *readset, fd_set* writeset, fd_set *exceptset, conststruct timeval * timeout)

中的描述符不仅仅是套接口还可以是任何描述符

timeout指定了等待的时间:当取 NULL指针的时候代表的是无限时间等待

                                          当取0的时候是立即返回

                                          当不是以上情况的时候,就等待timeout的时间,如果没有满足                                     的套接口就返回了。

设置描述符集的函数有

voidFD_ZERO(fd_set *fdset);清空描述符集

voidFD_SET(int fd, fd_set* fd_set);把fd加入到fd_set描述符集中

voidFD_CLR(int fd, fd_set* fd_set);把fd删除

voidFD_ISSET(int fd, fd_set* fdset);判断fd是不是fdset字符集的描述符


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值