• 信息安全系统设计基础第九周总结


    第十章 系统级I/O

    输入操作是从I/O设备拷贝数据到主存,输出操作是从主存拷贝数据到I/O设备

    10.1Unix I/O

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

    所有的I/O设备都被模型化为文件,所有的输入和输出都被当作对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O

    • 打开文件
    • 改变当前文件位置
    • 读写文件
    • 关闭文件

    10.2打开和关闭文件

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

    flags参数指明了进程打算如何访问这个文件:

    • O_RDONLY:只读
    • O_WRONLY:只写
    • O_RDWR:可读可写

    flags参数也可以是一个或者更多位掩码的或,为写提供给一些额外的指示:

    • O_CREAT:如果文件不存在,就创建他的一个截断的(空)文件
    • O_TRUNC:如果文件已存在,就截断他
    • O_APPEND:在每次写操作前,设置文件位置到文件的结尾处

    进程通过调用close函数关闭一个打开的文件

    10.3读和写文件

    应用程序是通过分别调用read和write函数来执行输入和输出的

    read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量

    write函数从存储器位置buf拷贝最多n个字节到描述符fd的当前文件位置。下图展示了一个程序使用read和write调用一次一个字节的从标准输入拷贝到标准输出

    在某些情况下,read和write传送的字节比应用程序要求的要少。这些不足置不表示有错误,出现这种情况的原因如下:

    • 读时遇到EOF
    • 从终端读文本行
    • 读和写网络套接字

    10.4用RIO包健壮的读写

    RIO提供了两类不同的函数:

    • 无缓冲的输入输出函数
    • 带缓冲的输入函数

    无缓冲的输入输出函数:通过调用rio-readn和rio-writen函数,应用程序可以在存储器和文件之间直接传送数据

    10.5读取文件元数据

    应用程序能够通过调用stat和fstat函数,检索到关于文件的信息(元数据)

    st-size成员包含了文件的字节数大小。st-mode成员则编码了文件访问许可位和文件类型

    Unix识别大量不同的文件类型

    • 普通文件:二进制或文本数据
    • 目录文件:其他文件的信息

    Unix提供的宏指令根据st-mode成员来确定文件的类型

    10.6共享文件

    可以用许多不同的方式来共享Unix文件

    内核用三个相关的数据结构来表示打开的文件:

    • 描述符表
    • 文件表
    • v-node表

    10.7I/O重定向

    Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来

    I/O重定向一种方式是使用dup2函数工作

    附录A 错误处理

    错误处理包装函数:给定某个基本的系统级函数佛foo,给定一个有相同参数,只不过开头字母大写了的包装函数Foo.包装函数调用基本函数并检查错误.如果包装函数发现了错误那么它就打印一条信息并终止进程.否则,他返回到调用者

    A.1Unix系统中的错误处理

    系统级函数调用使用三种不同风格的返回错误:Unix风格,Posix风格,DNS风格

         1.Unix风格的错误处理

            Unix早期开发出来的函数的函数返回值既包括错误代码,也包括有用的结果

            Unix风格的错误处理代码通常具有以下形式:

            strerror函数返回某个errno值的文本描述

         2.Posix风格的错误处理

            只用返回值来表明成功(0)或者失败(非0),任何有用的结果都返回在通过引用传递进来的函数参数中

            Posix风格的错误处理代码通常具有以下形式:

         3.DNS风格的错误处理

            在失败时返回NULL指针,并设置全局变量h_errno

            DNS风格的错误处理代码通常具有以下形式:

         4.错误报告函数小结

            使用下列错误报告函数来包容不同的错误处理风格:

    错误报告函数的代码:

    A.2错误处理包装函数

    • Unix风格的错误处理包装函数

            如果wait返回一个错误,包装函数打印一条信息,然后退出.否则,他向调用者返回一个PID

    • Posix风格的错误处理包装函数

            他的错误返回码中不会包含有用的结果,所以成功时,包装函数返回void

    • DNS风格的错误处理包装函数

  • 相关阅读:
    学算法的那些年,吴师兄接触的网站、软件、视频、书籍大揭秘
    阮一峰:CSS Modules 用法教程
    截取url参数
    在dotnet core实现类似crontab的定时任务
    开源一个基于dotnet standard的轻量级的ORM框架-Light.Data
    ABP Vnext使用mysql数据库
    实现ElementUI Dialog宽度响应式变化
    使用Vue Baidu Map对百度地图实现输入框搜索定位
    使用Docker搭建HttpRunnerManager环境
    SpringBoot集成spring aop开发
  • 原文地址:https://www.cnblogs.com/20135305yg/p/4933950.html
Copyright © 2020-2023  润新知