GNULinux编程课件第10章

上传人:xian****812 文档编号:301732800 上传时间:2022-05-31 格式:PPT 页数:40 大小:201.50KB
返回 下载 相关 举报
GNULinux编程课件第10章_第1页
第1页 / 共40页
GNULinux编程课件第10章_第2页
第2页 / 共40页
GNULinux编程课件第10章_第3页
第3页 / 共40页
GNULinux编程课件第10章_第4页
第4页 / 共40页
GNULinux编程课件第10章_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《GNULinux编程课件第10章》由会员分享,可在线阅读,更多相关《GNULinux编程课件第10章(40页珍藏版)》请在金锄头文库上搜索。

1、第10章I/O操作模式郑谦益、韩京宇概述I/O操作模式操作模式文件文件I/O操作模式操作模式内存的内存的I/O映射映射文件锁文件锁终端终端I/O操作操作I/O操作模式I/O操作模式阻塞方式非阻塞方式同步方式异步方式阻塞方式概念 通常,在应用程序发出I/O请求后,如果I/O操作不能立刻完成,Linux内核将发出读写请求的进程暂时挂起,将CPU交给其他进程,等I/O完成后,重新切换回原来的进程继续运行,这种I/O处理方式称为阻塞方式。 非阻塞方式概念 进程在发出读写请求后,不管I/O是否真正完成,可立即返回,继续执行。问题在于如何获知I/O操作已经完成,一种方法是不断地查询I/O状态,另一种方法是

2、由操作系统通知I/O操作的完成,这种I/O处理方式称为非阻塞方式。同步方式概念 进程在发出文件读写请求后,如果需要进程等待或通过某种方式检查I/O操作是否完成,从而决定是否继续执行后续的工作,这种方式称为同步I/O方式。异步方式异步方式 概念 进程在发出文件读写请求后,如果进程能继续执行其他工作,由内核以消息的方式通知进程请求的I/O操作已经完成,无需等待或检查I/O操作是否完成,这种方式称为异步I/O方式;文件I/O操作模式文件I/O操作模式同步阻塞I/O模式同步非阻塞I/O模式I/O多路复用模式信号驱动I/O模式异步I/O模式同步阻塞I/O模式概念 通常,在进行I/O操作时,必须等到I/O

3、操作完成才能进行下一步的操作,这种操作方式称为同步阻塞I/O模式,同步阻塞I/O模式实例分析int fd_line,fd_kb,fd_display;char chr_from_kb10;char chr_from_line10;void test()while (1) read(fd_kb, &chr_from_kb, 1); /非阻塞write(fd_line, &chr_from_kb, 1);read(fd_line, &chr_from_line, 1);/非阻塞write(fd_display, &chr_from_line, 1);同步非阻塞I/O模式概念 在进程发出文件读写请求

4、后,无论I/O操作是否完成,立刻返回。这样进程可继续执行后续代码。为了获知文件的I/O操作是否完成,需不断地对文件I/O状态进行测试。同步非阻塞I/O模式同步非阻塞I/O模式方法一: 在打开文件时,设定打开的方式为非阻塞方式,例如: open(fifo1,O_RDONLY|O_NONBLOCK);方法二: 如果文件已经打开,可通过fcntl函数改变文件的I/O模式.方法三: 如果文件已经打开,也可通过ioctl函数来改变I/O操作的方式。同步非阻塞I/O模式头文件#include #include #include 函数原型int fcntl(int fildes, int cmd)int f

5、cntl(int fildes, int cmd, long arg)功能设置文件描述符的相关特性参数fildes文件描述符cmd操作的指令arg操作的参数返回值错误,返回-1,否则,依操作而定多路复用多路复用I/O模式模式 概念 基于多路复用I/O模式的进程可同时对多个文件描述符的读写状态进行检测,直到发现这些描述符中某个的状态发生了变化时返回。这表明检测到某文件的I/O操作已经完成。此时,进程可根据返回的状态进行真正的读写操作。多路复用多路复用I/O模式模式多路复用多路复用I/O模式模式头文件#include 函数原型int select(int n, fd_set *readfds, f

6、d_set *writefds, fd_set *exceptfds,struct timeval *timeout)功能I/O多路复用参数n 表示最大的文件描述符+1readfds 可读文件描述符集合writefds 可写文件描述符集合exceptfds 异常文件描述符集合timeout 超时结束时间返回值0 超时返回n若检测到文件描述符状态发生改变,返回状态改变的个数0 若发生错误,信号驱动的I/O模式概念 信号驱动I/O模式是利用文件描述符的I/O状态的变化,产生SIGIO信号,通过对SIGIO信号的处理,读写相应的数据。信号驱动的I/O模式信号驱动的I/O模式实现步骤1. 利用sign

7、al或sigaction函数定义信号SIGIO的处理函数。2. 使用fcntl函数对文件描述符在状态发生变化产生SIGIO信号时,设置信号发送的对象。3. 在运用open函数打开文件时,或运用fcntl函数对已打开的文件,设置为O_ASYNC方式。异步I/O模式概念 在进程发出I/O读写请求后,无论I/O操作是否完成,立刻返回,继续执行后续的代码,当要求的I/O操作完成时,内核向发出请求的进程发送信号,通知I/O操作已完成,此时,操作的数据已就需,无需在内核与用户空间之间进行拷贝,这种I/O操作方式称为异步I/O模式。异步I/O模式 在标准中,定义了异步I/O模式的函数接口。Linux内核从版

8、本开始支持异步I/O模式,在文件操作集中增加了异步I/O的操作接口。API函数aio_read()aio_write()aio_error()aio_return()内存的I/O映射内存的I/O映射概念 内存的I/O映射是将文件某区间的内容映射至进程的虚拟地址空间的某个区域的技术。通过对文件的内存I/O映射,可使用户对文件的操作转换为对内存的操作。内存的I/O映射头文件#include 函数原型void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)功能将文件的内容映射至内存参数sta

9、rt内存开始位置length映射内容的长度prot设定存取权限flags设定运行模式fd文件描述符offset在文件中的偏移量返回值成功,返回内存映射的开始地址,否则,返回-1文件锁文件锁文件锁文件锁当多个进程同时存取同一个文件时,有可能出现数据不一致的现象。为了避免这种现象的发生,在多个进程同时存取同一个文件时,必须遵守一定的规则。锁就是这样一种机制。1. 共享锁2. 互斥锁文件锁文件锁头文件#include 函数原型int flock(int fd, int op)功能a为一个打开的文件描述符上锁或解锁参数fd已打开的文件描述符opa加锁方式返回值成功,返回0,否则,返回-1,同时errn

10、o被设置终端终端I/O终端的行为模式终端的行为模式终端的行为的变化可通过改变其属性来实现,但由于终端所涉及的属性比较多,因此,不同属性值的组合,会使得终端表现出不同的行为方式。常用终端行为模式有以下三种:1. 规范模式2. 非规范模式3. 原始模式规范模式概念 这是我们常用的模式,是终端设备驱动通常使用的模式。终端驱动将从键盘接收的字符暂时存放于编辑缓冲区。因此,用户可对键盘输入进行行编辑,直至接收到回车键。终端驱动在接收到回车键后,将编辑缓冲区中的内容传递给应用程序。在这种模式下,终端驱动还负责对一些特殊字符进行处理,如CTRL-C等。非规范模式概念 在这种模式下,终端驱动关闭了编辑缓冲区,

11、驱动将从键盘上接收的字符直接传送给应用程序,其中包括退格键和光标移动键等,这些键不再具有编辑功能,但仍然保留了对一些特殊字符的处理。原始模式概念 在这种模式下,终端驱动不仅关闭了编辑缓冲区,而且也关闭了对一些特殊字符的处理,如退格键、光标移动键和CTRL-C键等。终端驱动将接收的任意一个字符都上传给应用程序。终端模式的设置API函数tcgetattr()tcsetattr()struct termios tcflag_t c_iflag; / 输入模式tcflag_t c_oflag; / 输出模式 tcflag_t c_cflag; / 控制模式tcflag_t c_lflag; / 本地模

12、式cc_t c_ccNCCS; / 特殊控制字元终端模式的设置头文件#include 函数原型int tcgetattr(int fd, struct termios *info)功能获取终端设备驱动程序的属性参数fd 终端文件描述符info 指向终端结构的指针返回值成功,返回0,否则,返回-1终端模式的设置头文件#include 函数原型int tcsetattr(int fd, int when, const struct termios *info)功能设置终端设备驱动程序的属性参数fd 终端文件描述符when 改变设置的时间info 指向终端结构的指针返回值成功,返回0,否则,返回-1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号