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


    第十章系统级I/O

    10.1 Unix I/O

    一个文件就是一个字节序列。

    所有的I/O设备,如网络、磁盘、和终端,都被模型化为文件,而所有的输入和输出都被当做想对应的文件的读写来执行。

    这使得所有的输入输出都能以一种统一却一致的方式来执行

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

    10.2 打开和关闭文件

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

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

    flags 参数 :

    • O_RDONLY: Reading only

    • O_WRONLY: Writing only

    • O_RDWR: Reading and writing

    关闭文件

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

    10.3读和写文件

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

    读文件

    include <unistd.h>
    ssize_t read(int fd, void *buf, size_t n);//Returns: number of bytes read if OK, 0 on EOF, −1 on error
    

    写文件

    #include <unistd.h>
     
    ssize_t write(int fd, const void *buf, size_t n);//Returns: number of bytes written if OK, −1 on error
    

    10.4 用RIO包健壮的读写

    可靠的读

    ssize_t rio_readn(int fd, void *usrbuf, size_t n) {
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;
    while (nleft > 0) {
        if ((nread = read(fd, bufp, nleft)) < 0) {
    }
            if (errno == EINTR)
                nread = 0;
            else
                return -1;
        }
        else if (nread == 0)
            break;
        nleft -= nread;
        bufp += nread;
    }
    return (n - nleft);
    }
    

    可靠的写 :

    ssize_t rio_writen(int fd, void *usrbuf, size_t n)
        size_t nleft = n;
        ssize_t nwritten;
        char *bufp = usrbuf;
    while (nleft > 0) {
        if ((nwritten = write(fd, bufp, nleft)) <= 0) {
            if (errno == EINTR)  /* Interrupted by sig handler return */
                    nwritten = 0;
                else
    return -1;
            }
            nleft -= nwritten;
            bufp += nwritten;
    }
    return n; }
    

    10.5 读取文件元数据

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

    10.6 共享文件

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

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

    10.7 i/o重定向

    unix提供重定向操作符,允许用户将磁盘文件和标准输入输出联系起来

    方法之一使用dup2函数

    10.8 标准i/o

    • ANSI C定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库(libc)提供了打开和关闭文件的函数(fopen和fclose)、读和写字节的函数(fread和fwrite)、读和写字符串的函数(fgets和fputs)、以及复杂的格式化I/O函数(printf和scanf)。

    使用标准I/O的好处

    • 因为在出UNIX的很多操作系统(包括Windows, linux)上都实现了此库,所有有利于软件的移植。

    与UnixI/O的主要区别

    • UNIX I/O的函数都是针对文件描述符的,而标准I/O的操作都是围绕流进行的。所为的流就是一个FILE *
    • 标准I/O提供了缓存--为了尽量减少write, read的调用。
    • 标准I/O的效率会低一些,因为它是多了一层封装。即,fread通过调用read来实现。

    标准I/O的头文件

    stdio.h
    三个标准I/O流预定义指针:stdin, stdout, stderr
    (Unix I/O: STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO)

    10.9 综合:我该使用哪些i/o函数

    • 尽量只使用标准I/O,而不要涉及低级的Unix I/O函数
    • 建议在网络套接字上不要使用标准I/O函数来进行输入和输出。而要使用健壮的RIO函数。
    • 标准I/O流,从某种意义上来说是全双工的,因为程序能够在同一个流上执行输入和输出。

    体会:本周的内容比较抽象,讲的是系统级I/O。虽然内容不是很多,但是理解起来有些困难,所以阅读了很多遍才了解其中的初级内容,如果要对这个有深入地了解还需要查阅更多的资料。

    参考资料:

  • 相关阅读:
    python 安装xlrd指定版本操作,由于高级版本不直接支持打开xlsx
    python 无法升级问题解决
    将excel文件信息转为json信息,支持合并单元格
    关于数据库copy到excel时出现换行、换列行为处理方式
    关于spring security中设置header无效问题解决方式.
    mysql 提示ONLY_FULL_GROUP_BY的问题
    java 监听配置文件,无需重启服务即可热修改配置信息
    mysql 根据多表联查后的结果集更新一个表
    springboot阿里云视频点播服务实现上传视频和删除功能
    阿里云服务端SDK下载通过maven命令安装
  • 原文地址:https://www.cnblogs.com/5320zhq/p/4945074.html
Copyright © 2020-2023  润新知