I/O处理的5种模型
- 阻塞I/O模型
若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才返回。如:键盘、屏幕、终端、网络设备(低速I/O设备)的访问。若不设置默认均为阻塞模式。
- 非阻塞模型
当请求的I/O操作不能完成时,则不让进程休眠,而且返回一个错误。如:open、read、write访问。
- I/O多路转接模型
如果请求的I/O操作阻塞,且他不是真正阻塞I/O,而且让其中的一个函数等待,在这期间,I/O还能进行其他操作。如:select函数。
- 信号驱动I/O模型
在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。
- 异步I/O模型
在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。由内核进行后续处理,这种用法现在较少。
非阻塞I/O
- 低速的系统调用(键盘、屏幕),进程可能会阻塞
- 非阻塞I/O确定操作(read,open,write)不阻塞,如果操作不能完成,则出错返回。
- 设定非阻塞的方式
- 使用open打开文件,设置O_NONBLOCK标志。
- 如果一个文件已经打开,则使用fcntl修改文件状态标志。 亦可以使用已经封装好的set_fl,设置O_NONBLOCK标志。
- 若不设置默认均为阻塞模式。