CSAPP:第十章 系统级I/O
CSAPP:第十章 系统级I/O
10.1 unix I/O10.2 文件10.3 读取文件元数据10.4 读取目录内容10.5 共享文件10.6 我们该使用哪些I/O函数?
10.1 unix I/O
所有的I/O设备(例如网络、磁盘和终端)都被模块化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行。这种允许Linux内核引出一个简单、低级的应用接口,称为Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:
- 打开文件。
- 改变当前的文件位置,
- 读写文件。
- 关闭文件。
10.2 文件
每个Linux文件都有一个类型来表明它在系统中的角色:
- 普通文件。包含任意数据。
- 目录文件。包含一组链接的文件。
- 套接字。用来与另一个进程进行跨网络通信的文件。
- 命名管道。
- 字符文件。
- 块设备。
Linux内核将所有文件组织成一个目录层次结构。
打开和关闭文件
进程通过调用open函数来打开一个已经存在的文件或者创建一个新的文件:
1#include <sys/types.h>
2#include <sys/stat.h>
3#include <fcntl.h>
4/*
5 * filename : 文件名
6 * flags :
7 * O_RDONLY:只读
8 * O_WRONLY:只写
9 * O_RDWR:可读可写
10 * O_CREAT:如果文件不存在,创建新文件
11 * O_TRUNC:如果文件存在,截断它
12 * O_APPEND:在每次写操作前,设置文件位置到文件结尾处
13 * mode :指定了新文件权限
14 * 返回值:返回文件描述符
15 */
16int open(char *filename,int flags,mode_t mode);
进程通过调用close来关闭一个已经打开的文件:
1#include <unistd.h>
2int close(int fd);
读写文件
应用程序分别调用read和write函数来执行输入和输出的。
1#include <unistd.h>
2/* 返回:若成功则为读的字节数,若为EOF则为0,若出错为-1*/
3ssize_t read(int fd,void *buf,size_t n);
4/* 返回:若成功则为写的字节数,若出错为-1*/
5ssize_t write(int fd,const void *buf,size_t n);
10.3 读取文件元数据
应用程序能够通过stat和fstat函数,检索到关于文件的信息(有时也称为文件的元数据)
1#include <unistd.h>
2#include <sys/stat.h>
3
4int stat(const char *filename,struct stat *buf);//以文件名作为输入
5int fstat(int fd,struct stat *buf); //以文件描述符作为输入
6
7struct stat {
8 dev_t st_dev; /* ID of device containing file */
9 ino_t st_ino; /* inode number */
10 mode_t st_mode; /* protection */
11 nlink_t st_nlink; /* number of hard links */
12 uid_t st_uid; /* user ID of owner */
13 gid_t st_gid; /* group ID of owner */
14 dev_t st_rdev; /* device ID (if special file) */
15 off_t st_size; /* total size, in bytes */
16 blksize_t st_blksize; /* blocksize for filesystem I/O */
17 blkcnt_t st_blocks; /* number of 512B blocks allocated */
18
19 /* Since Linux 2.6, the kernel supports nanosecond
20 precision for the following timestamp fields.
21 For the details before Linux 2.6, see NOTES. */
22
23 struct timespec st_atim; /* time of last access */
24 struct timespec st_mtim; /* time of last modification */
25 struct timespec st_ctim; /* time of last status change */
26
27#define st_atime st_atim.tv_sec /* Backward compatibility */
28#define st_mtime st_mtim.tv_sec
29#define st_ctime st_ctim.tv_sec
30};
10.4 读取目录内容
应用可以用readdir系列函数来读取目录的内容。
1#include <sys/types.h>
2#include <dirent.h>
3
4DIR *opendir(const char *name);
5
6struct dirent *readdir(DIR *dirp); //若成功,返回指向下一个目录的指针
7
8struct dirent{
9 ino_t ; /*inode number*/
10 char d_name[256]; /*Filename*/
11};
12
13int closedir(DIR *dirp);//关闭目录
10.5 共享文件
- 描述符表。每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项,指向文件表中的一个表项。
- 文件表。打开文件的集合是由一张文件表来表示的,所有进程共享这张表。
- v-node表。同文件表一样,所有进程共享这张v-node表。每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员。
10.6 我们该使用哪些I/O函数?

CSAPP:第十章 系统级I/O的更多相关文章
- [CSAPP笔记][第十章 系统级I/O]
第十章 系统级I/O 输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程. 高级别I/O函数 scanf和printf <<和>> 使用系统级I ...
- 第十章 系统级I/O
第十章 系统级I/O 一.Unix I/O 1.一个unix文件就是一个m个字节的序列 2.unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(0) .标准输出(1)和标准错误(-1). 二 ...
- 深入理解计算机系统 第十章 系统级I/O
很多高级语言都提供了执行 I/O 的较高级别的函数.为什么我们还要学习 Unix I/O? 原因:1.由于 I/O 和其他系统概念之间有循环依赖关系,故了解 Unix I/O 将帮助我们理解其他的系统 ...
- 深入理解计算机系统 第十章 系统级I/O 第二遍
了解 Unix I/O 的好处 了解 Unix I/O 将帮助我们理解其他的系统概念 I/O 是系统操作不可或缺的一部分,因此,我们经常遇到 I/O 和其他系统概念之间的循环依赖.例如,I/O 在进程 ...
- 系统级I/O 第八周11.9~11.15
第十章 系统级I/O cp1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...
- 系统级I/O 第八周11.1~11.8
第十章 系统级I/O 输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程.输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备. 所有语言的运行时系统都提供执 ...
- 第十章实践——系统级I/O代码运行
第十章实践——系统级I/O代码运行 实验代码清单如下: 1. cp1——复制一个文件到另一个文件中(两个已经存在的文件) 复制前: 执行后结果 2. setecho.echostate——改变.显示输 ...
- 系统级编程(csapp)
系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...
- 系统级I/O学习记录
重要知识点 输入/输出(I/O) I/O是主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. 输出操作是从主存拷贝到I/O设备. Unix I/O ...
随机推荐
- Windows Server 2016-活动目录NTP时间同步
在实际生产域环境下,往往会有很多跟时间不同步相关的问题,简单的说几种常见的情景:本地客户端时间与域控时间不统一导致无法加域:每次客户端电脑输入密码到进入桌面环境等N久:Skype for Busine ...
- Kali Linux 渗透测试手册(1.1)安装虚拟机
翻译来自:掣雷小组 成员信息: thr0cyte, Gr33k, 花花, 小丑, R1ght0us, 7089bAt, 一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: 在W ...
- 2. CMake 系列 - 编译多文件项目
目录 1. 编译不使用第三方库的项目 1.1 项目目录结构 1.2 相关代码 1.3 编译 2. 编译使用第三方库的项目 2.1 项目目录结构 2.2 相关代码 2.3 编译 1. 编译不使用第三方库 ...
- 认识音频格式-Au (NeXT/Sun)
音频格式比较多, Au音频格式是一种被sun微处理器公司发明的一种简单的音频编码格式.日后一直在NEXT系统上使用,后面就演变成了一种标准的音频编码格式.目前很多音频设备上都支持这种编码格式.这种编码 ...
- 一个用来爬小说的简单的Node.js爬虫
小说就准备点天下霸唱和南派三叔的系列,本人喜欢看,而且数据也好爬.貌似因为树大招风的原因,这两作者的的书被盗版的很多,乱改的也多.然后作者就直接在网上开放免费阅读了,还提供了官网,猜想作者应该是允许爬 ...
- ASP.NET Core开发者指南
ASP.NET Core开发者指南 2019年ASP.NET Core开发者指南: 你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“ ...
- MySQL via EF6 的试用报告
1.如何通过 EF6 来连接 MySQL? 2.如何通过 EF6 来实现 CRUD? 2.1.Create 添加 2.2.Retrieve 查询 2.3.Update 修改 2.4.Delete 删除 ...
- Python实战171202元组访问
学生信息系统中数据为固定格式: (名字,年龄,性别,邮箱地址,......) 学生数量很大为了减小存储开销,对每个学生信息用元组表示: ('jim',18,'male','jim8765@gmail. ...
- 图像检索(3):BoW实现
在上一篇文章中图像检索(2):均值聚类-构建BoF中,简略的介绍了基于sift特征点的BoW模型的构建,以及基于轻量级开源库vlfeat的一个简单实现. 本文重新梳理了一下BoW模型,并给出不同的实现 ...
- 解读经典《C#高级编程》继承 页107-113.章4
前言 本章节开始讲接口. 接口 接口的声明很像抽象类,有方法的声明但无方法体.但它比抽象类限制更多.和类比起来,接口的定义有众多限制. 接口只能包含声明,而无方法体 接口只能包含方法.属性.索引器.事 ...