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 ...
随机推荐
- Linux 桌面玩家指南:10. 没有 GUI 的时候应该怎么玩
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- SUSE12SP3-Mycat(4)rule.xml配置详解
简介 rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义.我们可以灵活的对表使用不同的分片算法, 或者对表使用相同的算法但具体的参数不同.这个文件里面主要有 tableRule 和 fu ...
- 机器学习基石笔记:01 The Learning Problem
原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...
- C语言随机数使用方法
随机数在编程中还是有所应用,最近从网上学习到这方面一点知识,想把它写下来.一.使用随机数所需要的头文件和函数: 头文件:cstdlib(C++ 的 standard libraray) ...
- RecyclerViewSelectableAdapterDemo【封装BaseSelectableAdapter用于多选、单选,以及切换选中状态等功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录封装单选.多选.切换选中状态的BaseSelectableAdapter基类,配合Recyclerview使用. 注意:此Dem ...
- LindDotNetCore~Aspect面向方面编程
回到目录 Aspect面向方面编程 面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计.观点导向编程.剖面导向程序设计)是计算机科学中的一个术 ...
- RabbitMQ在Windows环境下的安装与使用
Windows下安装RabbitMQ 环境配置 部署环境 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com ...
- 微信公众号开发C#系列-4、获取接口调用凭证
概述 获取接口调用凭证实质就是获取access_token.在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒 ...
- 【Javascript】JS遍历数组的三种方法:map、forEach、filter
前言 近一段时间,因为项目原因,会经常在前端对数组进行遍历.处理,JS自带的遍历方法有很多种,往往不加留意,就可能导致知识混乱的现象,并且其中还存在一些坑.前端时间在ediary中总结了js原生自带的 ...
- Redux进阶(Redux背后的Flux)
简介 Flux是一种搭建WEB客户端的应用架构,更像是一种模式而不是一个框架. 特点 单向数据流 与MVC的比较 1.传统的MVC如下所示(是一个双向数据流模型) 用户触发事件 View通知Contr ...