2018-2019-1 20165330 《信息安全系统设计基础》第六周学习总结
学习目标
- 了解系统调用及错误处理方法
- 理解IO处理及文件系统
- 掌握Unix/Linux系统级I/O:
open
close
read
write
seek
stat
- 掌握
I/O
重定向的方法
学习内容
Linux I/O
Linux I/O
:将设备优雅地映射为文件的方式,允许Linux内核引出一个简单、低级的应用接口- 输入输出执行方式:
- 打开文件
- 描述符:内核打开文件时返回的一个小的非负整数
- 每个进程开始均有三个打开的文件
- 标准输入(描述符为0)
- 标准输出(描述符为1)
- 标准错误(描述符为2)
- 改变当前的文件位置
- 读写文件
- 关闭文件
- 打开文件
- 文件
-
类型:普通文件、目录、套接字
- 目录层次:
-
打开和关闭文件
- 调用
open
函数打开一个已存在的文件或创建一个新文件
int open(char *filename,int flags,mode_t mode);
flags
参数指明打开文件方式:- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:可读可写
flags
参数提供额外提示:- O_CREAT:文件不存在,创建一个截断(空)文件
- O_TRUNC:文件已存在就截断它
- O_APPEND:在每次写操作前,设置文件位置到文件的结尾处
- 关闭文件:
int close(fd);
- 调用
-
读和写文件
- 调用
read
和write
函数执行输入输出
size_t read(int fd,void *buf,size_t n); ssize_t write(int fd,void *buf,size_t n);
- 调用
-
RIO包
- 无缓冲的输入输出函数
#include "csapp.h" ssize_t rio_readn(int fd,void *usrbuf,size_t n); ssize_t rio_writen(int fd,void *usrbuf,size_t n);
- 带缓冲的输入函数
#include "csapp.h" void rio_readinitb(rio_t *rp,int fd); ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen); ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n);
- 读取文件元数据
- 调用
stat
和fstat
函数检索文件的信息(元数据)#include <unistd.h> #include <sys/stat.h> int stat(const char *filename,struct stat *buf); int fstat(int fd,struct stat *buf);
- 读取目录内容
- 返回目录流的指针
#include <dirent.h> #include <sys/stat.h> DIR *opendir(const char *name);
- 返回流dirp中下一目录项的指针
#include <dirent.h> struct dirent *readdir(DIR *dirp);
- 关闭流并释放所有资源
#include <dirent.h> int closedir(DIR *dirp);
I/O重定向
-
Linux shell提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
-
重定向到磁盘文件
foo.txt
:linux> ls > foo.txt
-
I/O重定向使用
dup2
函数工作#include <unistd.h> int dup2(int oldfd,int newfd);
两个重要命令
man -k key1 | grep key2| grep 2
:根据关键字检索系统调用- Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经常用到
- 在Ubuntu下可通过
man deluser
查看相关帮助文档 man -k
:根据关键字搜索联机帮助,是一种模糊搜索man -f
:关键字精确搜索,与-k不同,它只搜索与关键字完全匹配的帮助页man -a
:搜索并打开所有man中同名帮助man -aw
:显示所有手册文件的路径
grep -nr XXX /usr/include
:查找宏定义,类型定义grep -nr
:这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容- 查找宏 STDOUTFILENO 的值:
grep -nr STDOUTFILENO /usr/include
- 查找当前目录下
.c
中main函数
在那个文件中:grep main .c
grep [options]
:过滤/搜索特定字符[options]
主要参数:-a
:不要忽略二进制的数据-A<显示列数>
:除了显示符合范本样式的那一列之外,并显示该列之后的内容-b
:在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号-B<显示列数>
:除了显示符合范本样式的那一列之外,并显示该列之前的内容-c
:计算符合范本样式的列数。-V
:显示版本信息-q
:不显示任何信息
ch06课下测试错题总结
- 有关磁盘操作,说法正确的是()
A .
对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B .
磁盘以字节为单位读写数据
C .
磁盘以扇区为单位读写数据
D .
读写头总处于同一柱面
正确答案:A C D 书P409
- 有关RAM的说法,正确的是()
A .
SRAM和DRAM掉电后均无法保存里面的内容。
B .
DRAM将一个bit存在一个双稳态的存储单元中
C .
一般来说,SRAM比DRAM快
D .
SRAM常用来作高速缓存
E .
DRAM将每一个bit存储为对一个电容充电
F .
SRAM需要不断刷新
G .
DRAM被组织为二维数组而不是线性数组
正确答案: A C D E G 书P400