• 20145317《信息安全系统设计基础》第9周学习总结1


    20145317《信息安全系统设计基础》第9周学习总结1

    教材学习内容总结

    10.1 Unix I/O

    1. 一个unix文件就是一个m字节的序列(B0B1B2...Bm-1)。所有的IO设备,如网络,磁盘,终端,都被模型化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行。 2、所有的输入和输出都被当作统一的方式来处理:

      1)打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个IO设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。内核记录这个打开文件的所有信息,而应用程序只需记住这个描述符。

      Unix创建的每个进程开始都有三个打开的文件:标准输入(描述符为0),标准输出(描述符1),标准错误(描述符为2)。头文件unistd.h中定义了相关常量。

      2)改变当前的位置。内核保持一个文件位置k,对于每个打开文件,初始为0。这个文件位置是从文件开头起始的字节偏移量。

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

      4)关闭文件。内核释放文件打开时创建的数据结构,并恢复描述符到可获得描述符池中。

    10.2 打开和关闭文件

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

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       int open(char *filename, int flags, mode_t mode);
                     返回:若成功则为新文件描述符,若出错则为-1。
      
    2. Flag参数指明了进程打算如何访问这个文件:

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

    3. Mode参数指明了新文件的访问权限位。通过调用umask函数设置。

    4. Close函数关闭文件。

      #include <unistd.h>
      int close(int fd);
                      返回:若成功则0,若出错则为-1。
      

      关闭一个已关闭的描述符会出错。

    10.3 读和写文件

    #include <unistd.h>

    ssize_t read(int fd, void *buf, size_t n);

                         返回:若成功则为读的字节数,若EOF则为0,若出错则为-1。
    

    ssize_t write(int fd, const void *buf, size_t n);

                         返回:若成功则为写的字节数,若出错则为-1。
    

    某些情况下,原始的read,write传送的字节比应用程序要求的要少,这些不足值(short count)不一定是错误(比如read函数参数要读5个字节,结果只读了3个字节,即小于5),下面的情况下将可能发生不足值:

    1)读时遇到EOF。
    2)从终端读文本行。
    3)读和写网络套接字。
    

    为了避免不足值问题(健壮程序的需求,如Web服务器这样的网络应用),就需要通过反复调用read和write处理不足值。

    10.4 用RIO包壮健地读写

    RIO包会自动处理不足值。提供了两类不同的函数:

    • 无缓冲的输入输出函数

    • 带缓冲的输入函数

    1.无缓冲的输入输出函数

    通过调用rioreadn和riowriten函数,应用程序可以在存储器和文件之间直接传送数据。

     #include “csapp.h”
     ssize_t rio_readn (int fd, void *usrbuf, size_t n);
     ssize_t rio_writen (int fd, void *usrbuf, size_t n);
                              返回:若成功则为传送的字节数,若EOF则为0(只对rio_readn而言),若出错则为-1。
    

    2.带缓冲的输入函数

    1)文本行:一个由换行符结尾的ACSII码字符序列。Unix中换行符( )ACSII码换行符(LF)数字值均为0x0a。

    2)包装函数(rio_readlineb):

    从内部读缓冲区拷贝一个文件行,当缓冲区为空时,自动调用read填满缓冲区。

    3)rio_readnb:

    从和rio_readlineb一样的读缓冲区中传送原始字节。

     #include “csapp.h”
     void rio_readinitb(rio_t *rp, int fd)
                              返回:无
     ssize_t rio_readlineb (rio_t *rp,void *usrbuf, size_t n);
     ssize_t rio_readn (rio_t *rp, void *usrbuf, size_t n);
                              返回:若成功则为读的字节数,若EOF则为0,若出错则为-1。
    

    10.5 读取文件元数据

    1. 元数据:应用程序能够通过调用stat和fstat函数,检索到关于关于文件的信息,如创建时间,修改时间,metadata。

       #include <unistd.h>
       #include <sys/stat.h>
       int stat(const char *filename, struct stat *buf);
       int fstat(int fd, struct stat *buf);
                            返回: 若成功则为0,若出错则为-1.
      

      Stat函数以一个文件名作为输入,ftast以文件描述符作为输入。

                  

    学习进度条

     代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
    目标 5000行 30篇 400小时  
    第七周 1300/1750 11/11 140/140  
    第八周 1700/2000 13/13 160/160  
    第九周 2000/2400 14/15 180/180  
    第十周 2500/2800 15/17 0/200  

    参考资料

  • 相关阅读:
    ELK7.X中配置x-pack
    ELK报错及解决方案
    ELK + filebeat集群部署
    CentOS7.6中 KVM虚拟机内存、CPU调整
    Linux 设置定时清除buff/cache的脚本
    Nginx中配置https中引用http的问题
    使用Docker搭建Jumpserver堡垒机
    CenterOS7中解决No package mysql-server available.
    Tomcat启动慢的原因及解决方法
    记录 之-- java 的一些小技巧
  • 原文地址:https://www.cnblogs.com/5317p/p/6052889.html
Copyright © 2020-2023  润新知