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 ...
随机推荐
- July 02nd. 2018, Week 27th. Monday
Bad times make a good man. 艰难困苦出能人. Bad times make a good man, and hard times create strong men, but ...
- c# word文档的操作
参考https://blog.csdn.net/ruby97/article/details/7406806 Word对象模型 (.Net Perspective) 本文主要针对在Visual St ...
- echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
首先这种情况,我在网上看到了好多人问,确实也有正解,但是只是说出了其错误出现的原因,并没有给出解决方法. 我也是深受其害,所以呢,在这里记录一下,分享给还在困扰着的你们,迅速找出解决办法. 首先,我先 ...
- Python后台开发Django(会话控制)
页面跳转 页面跳转的url中必须在最后会自动添加[\],所以在urls.py的路由表中需要对应添加[\] from django.shortcuts import redirect #导入 retur ...
- javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)
接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...
- django插入数据库错误:mysql的1267错误
错误信息: django.db.utils.OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci,IM ...
- SpringSecurity设置角色和权限的注意点
概念 在UserDetailsService的loadUserByUsername方法里去构建当前登陆的用户时,你可以选择两种授权方法,即角色授权和权限授权,对应使用的代码是hasRole和hasAu ...
- SpringBoot实用小知识之Maven中dependencys和dependencymanagement区别
利用pom管理引用包时,如果是单项目的话就直接在dependencies引用了,若有一个大工程项目里面包含多个子模块,则为了所有项目模块包的版本统一和好管理,则需要用到dependencyManage ...
- 一套代码小程序&Web&Native运行的探索01
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 并且用小程序翻写了之前一个demo:[组件化开发]前端进阶篇之如何编写可维护可升级的代码 之前一直在跟业务方打交道 ...
- .NET Core 2.2 新增部分功能使用尝鲜
前言 美国当地时间12月4日,微软2019开发者大会中发布了一系列的重磅消息,包含了软硬件和开源社区的各种好消息是铺天盖地,作为一名普通的开发者,我第一时间下载了 .NET Core 2.2 ...