20135223何伟钦—信息安全系统设计基础第九周学习总结

学习目的:

1. 掌握系统编程和系统调用的概念

2. 掌握系统编程错误处理的方式

3. 掌握Unix/Linux系统级I/O(open close read write seek stat)

4. 掌握RIO

5. 掌握I/O重定向的方法

一、Unix I/O

Unix I/O定义:所有的I/O设备都被模型化为文件,所有的输入和输出都被当作

对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O

(一)打开文件

(1)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告它想要

访问一个I/O设备,内核返回一个小的非负整数

(2)unix系统创建每个进程的时候都有三个打开的文件:标准输入;标准输出,标准错误。

     标准输入(STDIN_FILENO):描述符为0

     标准输出(STDOUT_FILENO):描述符为1

     标准错误(STDERR_FILENO):描述符为2

(二)改变当前的文件位置

对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量)

当打开一个文件的最初时候文件的偏移量为0.

通过seek操作,可以显示的设置文件的当前位置为k

(三)读写文件

(1)读

读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n

(2)写

写操作是从存储器拷贝n>0个字节到一个文件,从当前文件位置开始然后更新K。

(四)关闭文件

应用通知内核关闭文件→内核释放文件打开时的数据结构→恢复描述符→释放存储器资源

二、打开和关闭文件

(一)open函数

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

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

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

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

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

(二)close函数

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

三、读和写文件

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

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

否则,返回值表示的是实际传送的字节数量

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

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

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

四、用RIO包健壮的读写

(1)无缓冲的输入输出函数

直接在存储器和文件之间传送数据(允许被中断的字节调用,并在必要的时候重启它们)。

  • ssizet riowriten(int fd,const void *usrbuf,size_t n);

    ssizet riowriten(int fd,const void *usrbuf,size_t n);

rio__writen函数遇到EOF的时候返回0;

rio__readn遇到EOF的时候返回不足值(即不足n的那个部分的字节数)。

(2)带缓冲的输入函数

允许用户高效地从文件中读取文本行和二进制数据(之前是一次读一个字节,应用这个函数之后,可以一次读一行函数)。

原理:函数从内部缓冲区中拷贝一个文本行,当缓冲区变空的时候,会自动地调用read重新填满缓冲区。

五.读取文件元数据

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

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

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

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

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

六、共享文件

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

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

七、I/O重定向

(1)I/O重定向操作符: >

ls > foo.txt

这句代码的含义就是使外壳加载和执行ls程序,并且将标准输出重定向到磁盘文件foo.txt。

(2)I/O重定向函数: dup2

函数定义为:

#include <unistd.h>

int dup2(int oldfd, int newfd);

返回值:成功返回描述符,错误返回-1

这个函数执行的操作是,拷贝描述符表表项oldfd,覆盖描述表表项newfd,如果后者被打开,则在拷贝前关闭它。

八、标准I/O

(一)标准I/O库

ANSI C定义了一组高级输入输出函数,称为标准I/O库,包含:

fopen、fclose,打开和关闭文件

fread、fwrite,读和写字节

fgets、fputs,读和写字符串

scanf、printf,复杂的格式化的I/O函数

(二)类型为FILE的流是对文件描述符和流缓冲区的抽象

标准I/O库将一个打开的文件模型化为一个流。

每个ANSI C程序开始的时候都有三个打开的流:stdin、stdout、stderr,

对应于标准输入、标准输出和标准错误 (参见第一节笔记),定义如下:

#include <stdio.h>

extern FILE *stdin;

extern FILE *stdout;

extern FILE *stderr;

Unix系统中的错误处理

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

(1)Unix风格

(2)Posix风格

(3)DNS风格

(一)Unix风格的错误处理

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

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

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

(二)Posix风格的错误处理

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

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

(三)DNS风格的错误处理

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

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

(四)错误报告函数

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

错误报告函数的代码:

(五)错误处理包装函数

(1)Unix风格的错误处理包装函数

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

(2)Posix风格的错误处理包装函数

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

(3)DNS风格的错误处理包装函数

学习体会:

当看到本次学习的章节内容较少时,我还以为这周的学习任务会比较轻松,可是当我认真看时,

发现很多内容我以前没有学习过,对此比较陌生。很多新知识需要慢慢理解,尤其代码需要花费一定的时间去弄明白。

总的来说,这章值得深入挖掘的代码部分也是十分重要的,由于这次学习过程比较匆忙,很多代码我并没有在实验环境中验证,

还是以理解为主。

参考资料:1.《深入理解计算机系统》第十章内容

              2.20135202闫佳歆-信息安全系统设计基础第八周学习总结  http://www.cnblogs.com/20135202yjx/p/4947272.html                         

时间: 2024-10-13 20:49:26

20135223何伟钦—信息安全系统设计基础第九周学习总结的相关文章

20135223何伟钦—信息安全系统设计基础第六周学习总结

第四章:处理器体系结构 ISA指令集体性结构——处理器支持的指令和指令的字节编码 HCL硬件控制语言—描述处理器设计 Y86——定义一个指令集体系结构,包括定义各种状态元素.指令集和他们的编码.一组编程规范和异常事件处理. 一.Y86指令集体系结构 (一)程序员可见的状态 1.Y86程序 每条指令都会读取或修改处理器状态的某些部分 2.程序员 可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器. 3.处理器状态(类似于IA32) ①8个程序寄存器,%eax,%ecx,%edx,%ebx,

20135219洪韶武-信息安全系统设计基础第九周学习总结

第九周学习总结 一.课本内容 1.每个unix文件都是一个m字节的序列:所有I/O设备如网络.磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作. 2.unix系统中输入输出的操作: 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符.unix系统创建每个进程的时候都有三个打开的文件:标准输入:标准输出,标准错误. 改变当前的文件位置.对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量). 读

20135223何伟钦—信息安全系统设计基础第十三周学习总结

学习任务: 1. 掌握三种并发的方式:进程.线程.I/O多路复用 2. 掌握线程控制及相关系统调用 3. 掌握线程同步互斥及相关系统调用 1.并发的意义 概念:只要逻辑控制流在时间上重叠,那么就可以称为并发. 意义: 访问慢速设备(如I/O设备):[CPU可以在这样的慢速中“腾出手”再去做其他事情,使自己保持“繁忙”.] 与人交互:每次用户进行某种操作的请求的时候[用户不会在意在自己进行操作的时候系统是否还处理着其他程序],一个独立的逻辑并发流被用来处理这个程序. 通过推迟工作来降低延迟 服务多

20135223何伟钦—信息安全系统设计基础第五周学习总结

第三章 程序的机器级表示 一.历史观点 Intel处理器(X86) 二.程序编码 gcc -01 -o p p1.c p2.c ①编译选项-01 表示编译器使用第一级优化 ②编译选项-02 表示编译器使用第二级优化(较好的选择) ③-o 表示分别将p1.c和p2.c编译后的可执行文件命名为p GCC将源代码转化为可执行代码的步骤: C预处理器:扩展源代码,插入所有#include命令指定的文件,并扩展生成.i文件 编译器:产生两个源代码的汇编代码,生成.s文件 汇编器:将汇编代码转化成二进制目标

20135223何伟钦—信息安全系统设计基础第三周学习总结

信息的表示和处理 2.0三种数字表示 无符号:编码基于传统的二进制表示法,表示大于或者等于零的数字. 补码:编码是表示有符号整数的最常见的方式,有 符号整数就是可以为正或者为负的数字. 浮点数:编码是表示实数的科学记数法 的以二为基数的版本. 溢出(overflow)的例子:使用 32 位来表示数据类型int,计算表达式200*300*400*500会得出结果 -884 901 888. 这违背了整数运算的特性,计算一组正数的乘积不应产生一个为负的结果. 2.1信息存储 机器级程序将存储器视为一

20135223何伟钦—信息安全系统设计基础第七周学习总结

第六章 存储器层次结构 [学习时间:6小时] [学习任务:<深入理解计算机系统>第六章] 6.1存储技术 6.1.1随机访问存储器 分为两类:静态(SRAM)和动态(DRAM). (1)SRAM:高速缓存存储器,既可以在CPU芯片上,也可以在片下. (2)DRAM:主存以及图形系统的帧缓冲区. 1.静态RAM SRAM将每个位存储在一个双稳态的存储器单元里.每个单元是用一个六晶体管电路来实现的.该电路有一个属性:可以无限期地保持在两个不同的电压配置或状态之一. 2.动态RAM 每位晶体管数 相

20135223何伟钦—信息安全系统设计基础第十二周学习总结

一.学习目标 1.掌握进程控制 2.掌握信号处理的方法 3.掌握管道和fifo进行进程间通信的方法 二.学习资源 编译.运行.阅读.理解process.tar.gz压缩包中的代码 三.编译.运行.阅读.理解代码 (1)exec1 execvp函数 表头文件: #include 定义函数: int execvp(const char file ,char const argv []); execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二

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

(1)ls 用来显示文件的详细信息(用户名,群组名,大小,创建时间,读写执行权.) (2)who 如何查看当前登录的用户? -who am i 如何列出登录的用户? -who或-w (3)fileinfo显示文件信息 用来实现显示文件信息,建立了一个stat数据结构. 要先判断命令是否有操作数 (4)spwd列出当前目录 (5)mkdir命令用于创建一个新的目录.这个新的目录不仅可以使用绝对路径,也可以使用相对路径.但用户创建新目录的前提条件是:创建者对被创建新目录的父目录应有写权限. 如何在其

20135234马启扬-——信息安全系统设计基础第九周学习总结

怎样学习系统编程(利用Linux学习Linux编程) 1 分析实用程序/bin, /usr/bin, /usr/local/bin学习使用工具,分析工具,了解功能和原理2 学习系统调用函数和系统调用本质上都是函数.不同的库,不同的头文件分析需要哪些系统调用,学习系统调用的使用方法:参数?返回值?3 编程实现利用上面的原理和一组协同工作的系统调用,自己编程实现使用程序的功能或积极主动抄代码,学习那些系统调用是协同工作的 C语言的学习可以参考这个思路,实现标准库伴随我们学习经常要问的三个问题:能做什