您的位置:首页 > 其它

20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART A

2016-11-10 22:44 323 查看

20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART A

明确教材学习目标

注意每个系统调用的参数、返回值,会查帮助文档

阅读教材,完成课后练习(书中有参考答案),考核:练习题把数据变换一下

学习视频,掌握两个重要命令:

man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用

grep -nr XXX /usr/include :查找宏定义,类型定义

教材中相关代码运行、思考一下,读代码的学习方法见「代码驱动的程序设计学习」。

代码重点:课程演示代码

教材学习内容总结

本章概述

①输入/输出(I/O)

是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程。

Unix I/O

个Unix 文件就是一个m个字节的序列:

B0,B1,···,Bk,···,Bm-1

在UNIX系统中有一个说法,一切皆文件。所有的I/O设备,如网络、磁盘都被模型化为文件。而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。

打开文件 打开文件操作完成以后才能对文件进行一些列的操作,打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。

改变当前的文件位置。

读写文件

关闭文件 应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。

打开和关闭文件

int open(char *filename,int flags,mode_t mode);

其中打开标志flags有三种基本标志:

O_RDONLY
O_WRONLY
O_RDWR
。也可以和其他三种(O_CREAT、O_TRUNC、O_APPEND)组合使用。

mode参数指定了新文件的访问权限位。(这次终于看到完全的mode参数的使用方法了)

图1:



读和写文件

在系统I/O中读写文件用的系统函数为
read()
write()
函数来执行。

#include <unistd.h>

ssize_t read(int fd,void * buf,size_t n);

ssize_t write(int fd,void *buf,size_t n);

read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。而write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。返回值要么为-1要么为写入的字节数目。

有些情况下,read和write传送的字节比应用程序要求的要少,出现这种情况的原因如下:

读时遇到EOF。此时read返回0来发出EOF信号。

从终端读文本行。如果打开文件是与终端相关联,那么每个read函数将以此传送一个文本行,返回的不足值等于文本行的大小。

读和写网络套接字。可能会出现阻塞现象。

读取文件元数据

应用程序能够通过调用stat和fstat函数检索到关于文件的信息

#include <sys/stat.h>
#include <unistd.h>

int stat(const char *filename,struct stat *buf);
int fstat(int fd,struct stat *buf);

若成功,返回0,若出错则为-1.stat以一个文件名为输入,并且填充buf结构体。fstat函数只不过是以文件描述符而不是文件名作为输入。

共享文件

内核用三个相关的数据结构来表示打开的文件:

描述符表(descriptor table)每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项。

文件表(file table) 打开文件的描述符表项指向问价表中的一个表项。所有的进程共享这张表。每个文件表的表项组成包括由当前的文件位置、引用计数(既当前指向该表项的描述符表项数),以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的应用计数。内核不会删除这个文件表表项,直到它的引用计数为零。

v-node表(v-node table)同文件表一样,所有的进程共享这张v-node表,每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员。

图2:


描述符1和4通过不同的打开文件表表项来引用两个不同的文件。这是典型的情况,没有共享文件,并且每个描述符对应一个不同的文件。

图3:


多个描述符也可以通过不同的文件表表项来应用同一个文件。如果同一个文件被open两次,就会发生上面的情况。关键思想是每个描述符都有它自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据。

图4:


父子进程也是可以共享文件的,在调用fork()之前,父进程如第一张图,然后调用fork()之后,子进程有一个父进程描述符表的副本。父子进程共享相同的打开文件表集合,因此共享相同的文件位置。一个很重要的结果就是,在内核删除相应文件表表项之前,父子进程必须都关闭了他们的描述符。

I/O使用的抉择方法

上图中展现了几种I/O的关系模式,在应用程序中应该使用哪些函数呢?标准I/O函数是磁盘和终端设备I/O的首选。但是对网络套接字上尽量使用健壮的RIO或者系统I/O

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第七周1300/175011/11140/140
第八周1700/200013/13160/160
第九周2000/240014/15180/180
第十周2500/280015/170/200

参考资料

《深入理解计算机系统V2》学习指导

2016-2017-1 《信息安全系统设计基础》教学进程

Linux 基础入门

《深入理解计算机系统》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: