学习主要内容
了解系统调用及错误处理方法
理解IO处理及文件系统
掌握Unix/Linux系统级I/O:open close read write seek stat
掌握I/O重定向的方法
1.Linux I/O
Linux I/O:将设备优雅地映射为文件的方式,允许Linux内核引出一个简单、低级的应用接口
输入输出执行方式:
打开文件
描述符:内核打开文件时返回的一个小的非负整数
每个进程开始均有三个打开的文件
标准输入(描述符为0)
标准输出(描述符为1)
标准错误(描述符为2)
改变当前的文件位置
读写文件
关闭文件
文件
类型:普通文件、目录、套接字
目录层次:image
打开和关闭文件
调用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);
2.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);
3.I/O重定向
Linux shell提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
重定向到磁盘文件foo.txt:linux> ls > foo.txt
I/O重定向使用dup2函数工作
#include <unistd.h>
int dup2(int oldfd,int newfd);
[](https://img2018.cnblogs.com/blog/1284381/201811/1284381-20181104140522460-1506322997
上周错题总结
1.有关磁盘操作,说法正确的是(ACD)
A .对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B .磁盘以字节为单位读写数据
C .磁盘以扇区为单位读写数据
D .读写头总处于同一柱面
2.有关RAM的说法,正确的是(ACDEG)
A .SRAM和DRAM掉电后均无法保存里面的内容。
B .DRAM将一个bit存在一个双稳态的存储单元中
C .一般来说,SRAM比DRAM快
D .SRAM常用来作高速缓存
E .DRAM将每一个bit存储为对一个电容充电
F .SRAM需要不断刷新
G .DRAM被组织为二维数组而不是线性数组