标签:
学习任务
(一)第十章概念
1.输入\输出(I\O)是主存和外部设备之间拷贝数据的过程。(输入)I\O→主存(输出)主存→I\O。
2.了解Unix I/O将帮助你理解其他的系统概念;有时你除了使用Unix I/O外别无选择。
10.1
所有的I/O设备,如网络、磁盘和终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行。这种将设备优雅地映射为文件的 方式,允许Unix内核引出一个简单、低级的的应用接口,称为Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:
10.2
进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件:
Int open(char *filename,int flags,mode_t mode);
Open函数将filename转换成为文件描述符并且返回描述数字。返回描述符总是在进程中当前没有打开的最小描述符。
l Flag参数指明了进程打算如何访问这个文件
也可以是一个或者更多位掩码的或,为写提供额外一些的指示
1.O_CREAT:如果文件不存在就创建他的一个截断(空)文件。
2.O_TRUNC:如果文件已经存在,就截断它。
3.O_APPEND:在每次写操作前,设置文件位置到文件的结尾处。
l mode参数指定了新文件的访问权限位。符号名字如下图。作为上下文的一部分,每个进程都有一个umask它是通过调用umask函数来设置的。当进程通过带某个mode参数的open函数调用来创建一个新文件时,文件的访问权限位被设置为mode&umask。
10.3
应用程序是通过分别调用系统函数 read和write函数来执行输入和输出的。
read函数从描述符为fd的当前文件位置拷贝最多N个字符到存储位置buf。返回值-1表示错误一个,0表示EOF。
size_t是作为usigned int,而ssize_t是作为int。
在某些情况下,read和write传送的字节比应用程序要求的要少。出现这种情况的可能的原因有:
10.4
1.RIO提供了两类不同的函数:
无缓冲的输入输出函数
带缓冲的输入函数
2.rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。类似的rio_writen函数从位置usrbuf传送n 个字节到描述符fd。rio_readn函数在遇到EOF时只能返回一个不足值。rio_writen函数绝不会返回不足值。
注意:如果rio_readn和rio_writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动地重启read或write。
3.一个文本行就是一个由 换行符 结尾的ASCII码字符序列。在Unix系统中,换行符是‘\n’,与ASCII码换行符LF相同,数值为0x0a。假设我们要编写一个程序来计算文本文件中文本行的数量应该如何来实现呢?
4.一种方法是用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。这种方法的问题就是效率不高,每次取文件中的一个字节都要求陷入内核。
一种更好的方法是调用一个包装函数(rio_readlineb),它从一个内部缓冲区拷贝一个文本行,当缓冲区变空时,会自动的调用read系统调用来重新填满缓冲区。
rio_readlineb函数最多读取(maxlen-1)个字节,余下的一个字节留给结尾的空字符。超过maxlen-1字节的文本行被截断,并用一个空字符结束。
10.5
应用程序能够通过调用stat和fstat函数,检索到关于文件的信息。
stat函数结构
st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位和文件类型。Unix识别大量不同的文件类型。普通文件包括某种类型的二进制或文本数据。对于内核而言,文本文件和二进制文件毫无区别。
目录文件包含关于其他文件的信息。套接字是一种用来通过网络与其他进程通信的文件。Unix提供的宏指令根据st_mode成员来确定文件的类型。这些宏的一个子集如下:
10.6
内核用三个相关数据结构来表示打开的文件
描述符表
文件表
v-node表
10.7
Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
I/O重定向的工作方式: 一种是使用dup2函数。
dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开了,dup2会在拷贝oldfd之前关闭newfd。
10.8
ANSI C定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库(libc)提供了打开和关闭文件的函数(fopen和fclose)、读和写字节的函数(fread和fwrite)、 读和写字符串的函数(fgets和fputs)、以及复杂的格式化I/O函数(printf和scanf)。
标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。每个ANSI C程序开始时都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出和标准错误:
10.9
各种I/O包
标准I/O流,从某种意义上来说是全双工的,因为程序能够在同一个流上执行输入和输出。
建议在网络套接字上不要使用标准I/O函数来进行输入和输出。而要使用健壮的RIO函数。
(二)练习题
1.完成课后练习(书中有参考答案)重点:10.1、10.2、10.3、10.4、10.5
10.1由于前面没学好,不知道下面这个是什么情况
后面也如此
10.4 重定向标准输入(描述符0)到描述符5,我们将调用dup2(5,0)或者等价的dup2(5,STDIN_FILENO).
2.重要命令:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
grep -nr XXX /usr/include :查找宏定义,类型定义
标签:
原文地址:http://www.cnblogs.com/heiguirenxi/p/4948041.html