I/O复用:select和poll函数
1.I/O复用是啥?
进程需要一种预先告知内核的能力,使得内核一旦发现进程指定一个或多个I/O条件就绪(输入已经准备好被读取,或者描述符已经能承接更多的输出),他就通知进程。这就是I/O复用。
I/O复用典型使用在以下场景:
①当客户处理多个描述符时,必须使用I/O复用。
②一个客户同时处理多个套接字是可能的,不过很少见。
③如果一个服务器要处理监听套接字,又要处理已连接套接字。
④ 如果一个服务器既要处理TCP又要处理UDP
⑤如果一个服务器要处理多个服务或多个协议
2.I/O模型
UNIX下的5中I/O模型:
①阻塞式I/O
②非阻塞式I/O
③I/O复用
④信号驱动I/O
⑤异步I/O
一个输入操作一般包括两部分:①等待数据准备好②从内核向进程复制数据
阻塞式I/O模型:最流行的I/O模型
非阻塞式I/O:当所请求的I/O操作非要把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。
I/O复用:调用select和poll,阻塞在这两个系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。
同步I/O和异步I/O对比, 同步导致请求进程阻塞,知道I/O操作完成为止。异步不导致请求进程阻塞。
3.select函数
该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。
4.str_cli函数
select重写select函数后,这样服务器进程一终止,客户就能马上得到通知。
调用select 处理可读套接字,如果在select返回时套接字是可读的,那就先readline读入回射文本行,再用fputs输出它。
处理可读输入:如果标准输入可读,那就先fgets读入一行文本,再用writen把它写到套接字中。
5.shutdown函数
终止网络的连接通常调用close函数。close有两个限制可通过shutdown来避免。
6.pselect函数
pselect比select有两个变化,①pselect使用timespec结构,而不是timeval结构。②pselect函数增加了六个参数。
7.poll函数
poll函数提供的功能和select类似。不过在处理流设备时,它能提供格外的信息。
8.总结