unix网络编程笔记六

阻塞式I/O模型

阻塞式I/O是我们常使用的I/O模型,很多函数默认都是阻塞的比如accept,read等函数。
在这里插入图片描述上面这个图展示了阻塞I/O的工作原理,在满足条件之前函数是不返回的比如recvfrom函数在没有网络数据到达之前不返回,当有数据到来时这个函数将数据从内核空间复制到用户空间。

非阻塞式I/O模型

指在一个函数的条件没有满足时,本应该不返回的但是非阻塞会使这个函数返回一个错误。
在这里插入图片描述上面图是将recvfrom函数设置为非阻塞,并且反复调用这个函数,如果没有从网络上到达的数据返回一个EWOULDBLOCK,直到有数据到达,再将数据从内核复制到用户空间,使用这种方式将浪费大量的资源。

I/O复用模型

在阻塞模型中会阻塞在一个套接字中,比如前面编写的客户端,我们每次只能阻塞在标准输入输出或者套接字上,但是I/O复用是阻塞在多个文件描述符之上的。
在这里插入图片描述阻塞在select上等待集合中的文件描述符变为可读可写或者错误便会返回,对象是多个描述符并不是阻塞在一个文件描述符上。

信号驱动式I/O模型

是使用信号,当文件描述符有数据时会从内核发送一个SIGIO信号,因此可以使用signal函数绑定一个信号处理函数,在这个信号处理函数中接收数据。
在这里插入图片描述# select函数

#include<sys/select.h>
#include<sys/time.h>
int select(int maxfd,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);

timeout参数表示超时时间,表示这个函数最多阻塞多长时间,当没有满足这个函数的条件时在timeout后便会返回。

struct timeval{
	long tv_sec;     //表示秒
	long tv_usec;   //表示微秒
};

这个参数可以设置以下值

  1. 设置为NULL,表示当没有满足条件时永远阻塞。
  2. 设置为固定的值,表示当没有满足条件时会在指定的时间后返回,满足条件时会立刻返回。
  3. 设置为0,表示检查文件描述符后立即返回。

fd_set类型是一个集合,里面存放文件描述符,下面是操作这个集合的函数

void FD_ZERO(fd_set *fdset);
void FD_SET(int fd,fd_set *fdset);
void FD_CLR(int fd,fd_set *fdset);
int  FD_ISSET(int fd,fd_set *fdset);

这个函数的作用便是检测readset,writeset,exceptset这三个参数是否有可读可写和错误的,当有时便会返回,可以检测这三个集合的一个或者多个,在检测之后这三个集合中会保留着满足条件的,其他的文件描述符会从中剔除。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值