20145310《信息安全系统设计基础》第九周学习总结

教材学习内容总结:

第十章:

第一节:Unix I/O:

1.打开文件
-一个应用程序通过要求内核打开相应的文件
-描述符:内核返回一个小的非负整数
-定义常量:
STDIN_FILENO(描述符为0)
STDOUT_FILENO(描述符为1)
STDERR_FILENO(描述符为2)
2.读写文件
(1)读
读操作就是从文件拷贝n>0个字节到存储器,并且改变文件当前位置。(如果当前位置是k,则改变为k+n)
※EOF的来源:
这里有一个一直以来的理解上的误区:文件结尾处没有明确的EOF信号,是当文件当前位置的数值超过了文件大小时,会处罚一个称为end-of-file的条件,能够被应用程序检测到,这就是所谓的EOF信号。
(2)写
写操作是从存储器拷贝n>0个字节到一个文件,然后更新当前文件位置。
3.关闭文件
应用通知内核关闭文件→内核释放文件打开时的数据结构→恢复描述符→释放存储器资源。

第二节 打开和关闭文件

1.open函数
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
O_CREAT:文件不存在,就创建新文件
O_TRUNC:如果文件存在,就截断它
O_APPEND:写操作前设置文件位置到结尾处
mode:指定了新文件的访问权限位

第三节 读和写文件

应用程序是通过分别调用read和write函数来执行输入和输出的:
ssize_t read(int fd,void *buf, size_t n);
ssize_t write(int fd, const void *buf,size_t n);
某些情况下,read和write传送的字节比应用程序要求的要少,原因如下:
读时遇到EOF(end of file)
从终端读文本行
读和写网络套接字

第四节 用RIO包健壮的读写

RIO包:健壮的包,会自动为你处理之前所述的不足值
RIO提供两种不同函数
无缓冲的输入输出函数:这些函数直接在存储器和文件之间传送数据
通过调用rio_readn和writen函数
如果rio_readn和writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动重启rio_readn或writen
带缓冲的输入函数:这些函数允许你高效的从文件中读取文本行和二进制数据
调用一个包装函数rio_readlineb,它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区
每打开一个描述符都会调用一次rio_readinitb函数
对同一描述符,对rio_readlineb和rio_readnb的调用可以交叉进行,对这些带缓冲的函数的调用却不应和无缓冲的rio_readn函数交叉使用

第五节 读取文件元数据

元数据:应用程序能够通过调用stat和fstat函数,检索到关于关于文件的信息,如创建时间,修改时间,metadata。

 #include <unistd.h>
 #include <sys/stat.h>
 int stat(const char *filename, struct stat *buf);
 int fstat(int fd, struct stat *buf);

返回: 若成功则为0,若出错则为-1.
Stat函数以一个文件名作为输入,ftast以文件描述符作为输入。

第六节 共享文件

内核用三个相关的数据结构来表示打开的文件:
描述符表
文件表:打开文件的集合是由一张文件表来表示的。
v-node表
通过不同的打开文件表表项来引用两个不同的文件《没有共享文件,每个描述符对应一个不同的文件
多个描述符也可以通过不同的文件表表项来引用同一个文件
父子进程共享文件

第七节 I/O重定向

I/O重定向操作符: >
ls > foo.txt
这句代码的含义就是使外壳加载和执行ls程序,并且将标准输出重定向到磁盘文件foo.txt。
I/O重定向函数: dup2
函数定义为:

#include <unistd.h>
int dup2(int oldfd, int newfd);

返回值:成功返回描述符,错误返回-1
这个函数执行的操作是,拷贝描述符表表项oldfd,覆盖描述表表项newfd,如果后者被打开,则在拷贝前关闭它。

第八节 标准I/O

应用程序可以通过open、close、lseek、read、write和stat这样的函数来访问Unix I/O。
RIO函数:read和write的健壮的包装函数,自动处理不足值,为读文本行提供一种高效的带缓冲的方法。
标准I/O函数:提供了Unix I/O函数的一个更加完整的带缓冲的替代品,包括格式化的I/O例程。是磁盘和终端设备I/O之选。
套接字描述符:Unix对网络的抽象是一种称为套接字的文件类型,被称为套接字描述符。应用进程通过读写套接字描述符来与运行在其他计算机上的进程通信。
对流I/O限制是:
跟在输出函数之后的输入函数,必须在其中间插入fflush、fseek、fsetpos或者rewind函数,后三个函数使用Unix I/O中的lseek函数来重置当前的文件位置。
跟在输入函数之后的输出函数,必须在中间插入fseek、fsetpos或者rewind的调用,一个输出函数不能跟随在一个输入函数之后,除非该输入函数遇到了一个EOF。

代码托管截图

参考资料

posted @ 2016-11-13 21:45  20145310刘宇飞  阅读(196)  评论(1编辑  收藏  举报