zoukankan      html  css  js  c++  java
  • 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                         

  • 相关阅读:
    阿里播放器踩坑记录 进度条重构 video loadByUrl失效解决方案
    liunx 安装nc/netcat centos安装netcat
    jquery实现显示textarea输入字符数
    SQL 时间戳转换为日期
    .Net WebRequest异步请求与WebClient异步请求
    SQL删除多列语句
    jQuery为元素设置css的问题
    关于调试WCF时引发的异常XmlException: Name cannot begin with the '<' character, hexadecimal value 0x3C” on Client Side
    SQL删除指定条件的重复数据,只保留一条
    net.exe use命令的使用
  • 原文地址:https://www.cnblogs.com/20135223heweiqin/p/4948348.html
Copyright © 2011-2022 走看看