zoukankan      html  css  js  c++  java
  • 20145210《信息安全系统设计基础》第09周学习总结

    20145210《信息安全系统设计基础》第09周学习总结

    教材知识点总结

    Unix I/O

    ·输入输出的方式:
    ·打开文件
    ·改变当前的文件位置
    ·读写文件
    ·关闭文件

    ·描述符:在后续对此文件的所有操作中标识这个文件

    ·Unix进程开始时三个打开的文件:
    ·标准输入(描述符为0)
    ·标准输出(描述符为1)
    ·标准错误(描述符为2)

    打开和关闭文件

    ·调用open函数打开文件,若成功返回值为新文件描述符,若出错,返回值为-1

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    int open(char *filename,int flags,mod_it mode);
    

    ·flag参数

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

    一位或者多位掩码的或

    O_CREAT,表示如果文件不存在,就创建它的一个截断的文件。
    O_TRUNC:如果文件已经存在,就截断它。
    O_APPEND:在每次写操作前,设置文件位置到文件的结尾处。
    

    ·访问权限位在sys/stat.h中定义

    ·mode参数了指定新文件的访问权限位。作为上下文的一部分,每个进程都有一个umask,通过调用umask函数设置。当进程通过带某个带mode参数的open函数用来创建一个新文件的时候,文件的访问权限位被设置为mode & ~umask。

    ·调用close函数关闭文件,若成功则返回0,不成功则为-1

    include<unistd.h>
    int close(int fd);
    

    读和写文件

    ·调用read和write函数执行输入和输出
    ·read函数:若成功则为读的字节数,若EOF则为0,若出错则为-1
    ·write函数:若成功则为写的字节数,若出错则为-1

    #include <unistd.h>
    ssize_t read(int fd,void *buf,size_t n);
    ssize_t write(int fd,const void *buf,size_t n);
    

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

    ·不足值:read和write传送的字节比应用程序要求的少,不表示有错误
    ·出现不足值情况的原因:
    ·读时遇到EOF
    ·从终端读文本行
    ·读写网络套接字

    用RIO健壮地读写

    ·RIO包提供了方便、健壮和高效的I/O
    ·RIO提供两类不同的函数:
    ·无缓冲的输入输出函数
    ·带缓冲的输入函数
    ·应用程序通过调用rio_readn和rio_written函数可以在存储器和文件之间直接传送数据

    #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);
    

    ·rio_ readn函数在遇到EOF时,只能返回一个不足值;
    ·rio_ writen函数绝不会返回不足值。

    ·用一个程序来计算文本文件中文本行的数量的两种方法:
    ·用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。这个方法的缺点是效率低,每读取文件中的一个字节都要求陷入内核
    ·调用一个包装函数(rio_readlineb),它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区

    ·从rio_readnb和rio_readlineb读缓冲区中传送原始字节

    #include "csapp.h"
    
    void rio_readinitb(rio_t *rp,int fd)
    
    ssize_t rio_readlinrb(rio_t *rp,void *usrbuf,size_t maxlen);
    ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n);
    

    读取文件元数据

    ·应用程序能够通过调用stat和fstat函数,检索到关于文件的信息(元数据),若成功则为0,若出错则为-1

    #include <unistd.h>
    #include <sys/stat.h>
    int stat(cost char *filename,struc sta *buf);
    int fstat(int fd,struct stat *buf);
    

    ·宏指令:
    ·S_ISREG() 普通文件?二进制或文本数据
    ·S_ISDIR() 目录文件?包含其他文件的信息
    ·S_ISSOCK() 网络套接字?通过网络和其他进程通信的文件

    共享文件

    ·内核用三个相关的数据结构表示打开的文件:
    ·描述符表
    ·文件表
    ·v-node表
    ·三种打开文件的类型:
    ·典型:描述符各自引用不同的文件,没有共享
    ·共享:多个描述符通过不同的文件表表项引用同一个文件。(关键思想:每个描述符都有自己的文件位置,对不同描述符的读操作可以从文件的不同位置获取数据)
    ·继承:子进程继承父进程打开文件

    I/O重定向

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

    #include <unistd.h>
    
    int duo2(int oldfd,int newfd);
    
    

    ·dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述表表项newfd以前的内容,如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd

    遇到的问题以及解决办法

    问题一:练习10.1代码运行时出现问题:

    发现是没有csapp.h这个头文件,需要从网上下载csapp.h和csapp.c这两个文件,下载地址:http://csapp.cs.cmu.edu/public/code.html
    将下载好的两个文件移到/usr/include文件夹

    打开csapp.h头文件,在 #end if 前面加上一句#include <csapp.c>
    编译的时候要加上-lpthread选项

    问题二:全部操作完成之后运行还是出现了问题:

    将代码中Open和Close换成open和close,运行得到以下结果:

    问题三:已经新建了foo.txt及baz.txt两个文件,但还是出现这样的问题,分析可能是因为没有写明文件的位置,于是更改代码,将文件路径添加到代码中:

    代码运行成功!

    代码托管

    托管链接

    托管截图

    代码统计

    学习进程表

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第零周 0/0 1/1 10/10
    第一周 100/100 1/2 20/20
    第二周 120/220 1/3 35/55
    第三周 226/446 1/4 30/85
    第五周 141/587 1/5 30/115
    第六周 150/737 1/6 25/140
    第七周 100/837 1/7 20/160
    第八周 0/837 2/9 30/190
    第九周 183/1020 2/11 20/210
  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/20145210ysy/p/6059859.html
Copyright © 2011-2022 走看看