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

第十章 系统级I/O

输入/输出(I/O) : 是指主存外部设备(如磁盘,终端,网络)之间拷贝数据过程。

  • 高级别I/O函数

    • scanfprintf
    • <<>>
    • 使用系统级I/O函数实现
  • 系统级I/O函数。

    • Q:大多数时候高级别I/O函数都运行良好,为什么我们还要学Unix I/O
    • A:
      • 了解Unix I/O将帮助你理解其他的系统概念。
        • 要深入理解其他概念,必须理解I/O
      • 有时你除了使用Unix I/O别无选择
        • 标准I/O库没有提供读取文件元数据的方式。
          • 文件大小文件创建时间
        • 用于网络编程十分冒险。

10.1 Unix I/O

  • 一个Unix 文件就是一个m个字节的序列:

    • 所有I/O设备都被模型化为文件
    • 而所有的输入和输出都被当做相应文件读和写
  • 设备优雅地映射成文件,允许Unix内核引出一个简单低级应用接口。叫做Unix I/O

    • 使得所有的输入输出都能以一种统一且一致的方式来执行。

      • 打开文件: 应用程序要求内核打开文件

        • 内核返回一个小的非负整数,叫做描述符

          • 等于内核分配一个文件名,来标示当前的文件。
          • 内核记录有关这个打开文件的所有信息。应用程序只需要记住标示符。
        • Unix外壳创建进程时都有三个打开的文件

          • 标准输入(标示符0)
          • 标准输出(标示符1)
          • 标准错误(标示符2)
          • 头文件<unistd.h>定义了常量代替显式的描述符值
            • STDIN_FILENO
            • STDOUT_FILENO
            • STDERR_FILENO
      • 改变当前文件的位置(非文件目录)

        • 对于每个打开的文件,内核保持一个文件位置k

          • 初始为0
          • 文件位置即是从文件开头起始的字节偏移量
        • 执行lseek操作,显式地设置文件位置

      • 读写文件

        • 一个读操作就是从文件拷贝n个字节到存储器,然后将k增加到k+n

          • 给定一个大小为m字节的文件,当k>=m执行读操作会触发一个称 为end-of-file(EOF)的条件。
            • 应用程序能检测到这个条件(或者说信号?)
            • 文件结尾并没有这样的符号。
        • 写操作就是从存储器拷贝n个字节到一个文件,从当前文件位置k开始,然后更新k

      • 关闭文件 :当应用程序完成了文件的访问,通知内核关闭文件。

        • 响应

          • 内核释放文件打开时创建的数据结构。
          • 描述符恢复到可用的描述符池中。
        • 无论一个进程因为何种原因被关闭,内核会关闭所有它打开的文件。

10.2 打开和关闭文件

进程是通过调用 open函数来打开一个已存在的文件或者创建一个新文件的

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int open(char *filename,int flags,mode_t mode);

                        //返回:若成功则为新文件描述符,若出错为-1

open函数将filename转换为一个文件描述符,并且返回描述符数字。

  • 返回的描述符总是在进程当前没有打开的最小描述符

  • flags

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值