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


    信息安全设计基础第十周学习总结

    深化学习书中的内容

     i/o重定向

    • Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
    • I/O重定向的工作方式: 一种是使用dup2函数。

    `include <unisted.h>

    int dup2(int oldfd, int newfd);`

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

    书的课后习题

    练习题1

    下面的程序输出是什么?

    `#include csapp.h"
    
      int main()
      {
          int fd1, fd2;
    
          fd1 = Open("foo.txt", O_RDONLY, O);
          Close(fd1);
          fd2 = Open("baz.txt", O_RDONLY, O);
          printf("fd2 = %d
    ", fd2);
          exit(0);
       }
    

    `

    答案:

    Unix进程生命周期开始时,打开的描述符赋给了stdin(描述符0)、stderr(描述度2)。open函数总是返回最低的未打开的描述符,所以第一次调用open会返回描述符3.调用close函数会释放描述符3,最后对open的调用会返回描述符3,因此程序的输出是”fd2=3“.

    练习题2

    假设磁盘文件foobar.txt由6个ASCII码字符“foobar”组成。那么下列程序的输出是什么? 程序如下:

    `#include "csapp.h"
    
     int main()
     {
          int fd1, fd2;
          char  c;
    
          fd1 = Open("foobar.txt", O_RDONLY, O);
          fd2 = Open("foobar.txt", O_RDONLY, O);
          Read(fd, &c, 1);
          Read(fd2, &c, 1);
          printf("c = %c
    ", c);
          exit(0);
      }
    

    答案: 描述符fd1和fd2都有各自的打开文件表表项,所以每个描述符对于foobar.txt都有它自己的文件位置。因此,从fd2的读操作会读取,foobar.txt的第一个字母,并输出 c = f

    练习题3 就像前面一样,假设磁盘文件foobar.txt由6个ASCII码字符”foobar“组成。那么下列程序的输出是什么?

    `#include "csapp.h"
    
     int main()
     {
          int fd;
          char c;
    
          fd = Open("foobar.txt", O_RDONLY, O);
          if(Fork()==0){
             Read(fd, &c, 1);
             exit(0);
          }
          Wait(NULL);
          Read(fd, &c, 1);
          printf("c = %c
    ", c);
          exit(0);
     }
    

    答案:

    因为子进程会继承父进程的描述符表,以及所有进程共享的同一个打开文件表。因此,描述符fd在父子进程中都指向同一个文件表表项。当子进程读取文件的第一个字母时,文件位置加1.因此,父进程会读取第二个字节,而输出就是

    c = 0

    练习题4

    如何用dup2将标准输入重定向到描述符5?

    答案: 重定向标准输入(描述符0)到描述符5,我们将调用dup2(5,0)或者等价的dup2(5,STDIN_FILENO).

    练习题5

    假设磁盘文件foobar.txt由6个ASCII码字符“foobar”组成。那么下列程序的输出是什么?

    `#include "csapp.h"
    
     int main()
     {
          int fd1, fd2;
          char  c;
    
          fd1 = Open("foobar.txt", O_RDONLY, O);
          fd2 = Open("foobar.txt", O_RDONLY, O);
          Read(fd2, &c, 1);
          Dup2(fd2, fd1);
          Read(fd1, &c, 1);
          printf("c = %c
    ", c);
          exit(0);
      }
    

    答案:

    因为我们将fd1重定向到了fd2,输出实际上是

    c = 0.

    课上笔记:

    心得

    本周是要学习深化第十章的内容,所以就将练习题好好看了一遍,有很多知识又懂得了很多。。很不错。

  • 相关阅读:
    爱摘苹果的小明
    盗梦空间
    九九乘法表
    谁是最好的Coder
    画图
    黑色帽子
    a letter and a number
    运维开发面试题
    python 守护进程daemon
    kubernets 应用部署
  • 原文地址:https://www.cnblogs.com/20135239-yxlm/p/4967493.html
Copyright © 2020-2023  润新知