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的更多相关文章

  1. [CSAPP笔记][第十章 系统级I/O]

    第十章 系统级I/O 输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程. 高级别I/O函数 scanf和printf <<和>> 使用系统级I ...

  2. 第十章 系统级I/O

    第十章 系统级I/O 一.Unix I/O 1.一个unix文件就是一个m个字节的序列 2.unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(0) .标准输出(1)和标准错误(-1). 二 ...

  3. 深入理解计算机系统 第十章 系统级I/O

    很多高级语言都提供了执行 I/O 的较高级别的函数.为什么我们还要学习 Unix I/O? 原因:1.由于 I/O 和其他系统概念之间有循环依赖关系,故了解 Unix I/O 将帮助我们理解其他的系统 ...

  4. 深入理解计算机系统 第十章 系统级I/O 第二遍

    了解 Unix I/O 的好处 了解 Unix I/O 将帮助我们理解其他的系统概念 I/O 是系统操作不可或缺的一部分,因此,我们经常遇到 I/O 和其他系统概念之间的循环依赖.例如,I/O 在进程 ...

  5. 系统级I/O 第八周11.9~11.15

    第十章 系统级I/O cp1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...

  6. 系统级I/O 第八周11.1~11.8

    第十章 系统级I/O 输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程.输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备. 所有语言的运行时系统都提供执 ...

  7. 第十章实践——系统级I/O代码运行

    第十章实践——系统级I/O代码运行 实验代码清单如下: 1. cp1——复制一个文件到另一个文件中(两个已经存在的文件) 复制前: 执行后结果 2. setecho.echostate——改变.显示输 ...

  8. 系统级编程(csapp)

    系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...

  9. 系统级I/O学习记录

    重要知识点 输入/输出(I/O) I/O是主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. 输出操作是从主存拷贝到I/O设备. Unix I/O ...

随机推荐

  1. Linux 桌面玩家指南:10. 没有 GUI 的时候应该怎么玩

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  2. SUSE12SP3-Mycat(4)rule.xml配置详解

    简介 rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义.我们可以灵活的对表使用不同的分片算法, 或者对表使用相同的算法但具体的参数不同.这个文件里面主要有 tableRule 和 fu ...

  3. 机器学习基石笔记:01 The Learning Problem

    原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...

  4. C语言随机数使用方法

    随机数在编程中还是有所应用,最近从网上学习到这方面一点知识,想把它写下来.一.使用随机数所需要的头文件和函数:        头文件:cstdlib(C++ 的 standard libraray)  ...

  5. RecyclerViewSelectableAdapterDemo【封装BaseSelectableAdapter用于多选、单选,以及切换选中状态等功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录封装单选.多选.切换选中状态的BaseSelectableAdapter基类,配合Recyclerview使用. 注意:此Dem ...

  6. LindDotNetCore~Aspect面向方面编程

    回到目录 Aspect面向方面编程 面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计.观点导向编程.剖面导向程序设计)是计算机科学中的一个术 ...

  7. RabbitMQ在Windows环境下的安装与使用

    Windows下安装RabbitMQ 环境配置 部署环境 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com ...

  8. 微信公众号开发C#系列-4、获取接口调用凭证

    概述 获取接口调用凭证实质就是获取access_token.在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒 ...

  9. 【Javascript】JS遍历数组的三种方法:map、forEach、filter

    前言 近一段时间,因为项目原因,会经常在前端对数组进行遍历.处理,JS自带的遍历方法有很多种,往往不加留意,就可能导致知识混乱的现象,并且其中还存在一些坑.前端时间在ediary中总结了js原生自带的 ...

  10. Redux进阶(Redux背后的Flux)

    简介 Flux是一种搭建WEB客户端的应用架构,更像是一种模式而不是一个框架. 特点 单向数据流 与MVC的比较 1.传统的MVC如下所示(是一个双向数据流模型) 用户触发事件 View通知Contr ...