• 20145201《信息安全系统设计基础》第12周学习总结


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

    这周的学习我主要是看了之前的代码,通过实践更深入的把代码思考了,并修改了一些代码,增进理解。

    第十一周代码分析
    第十周代码分析
    第九周

    只挑了一些代码进行再分析。
    -cp1.c
    功能:复制文件或目录

    #include        <stdio.h>//标准输入输出
    #include        <stdlib.h>//C标准函数库
    #include        <unistd.h>//Unix类系统定义符号常量
    #include        <fcntl.h>//定义了很多宏和open,fcntl函数原型
    
    #define BUFFERSIZE      4096//定义存储器容量
    #define COPYMODE        0644//?
    
    void oops(char *, char *);
    
    int main(int argc, char *argv[])
    {
        int in_fd, out_fd, n_chars;//三个描述符值
        char buf[BUFFERSIZE];//存储器位置
        
        if (argc != 3) {//检查argc的值是否为三,如果不是,返回标准错误
            fprintf(stderr, "usage: %s source destination
    ", *argv);
            exit(1);
        }
        /*检查cp的第一个参数,要复制的文件,用open打开,in_fd为open返回的描述符
        如果返回-1,代表打开失败,提示错误*/
        if ((in_fd = open(argv[1], O_RDONLY)) == -1)
            oops("Cannot open ", argv[1]);
    
        /*检查cp的第二个参数,复制的目的地址,用create在目的地址创建新文件,out_fd为open返回的描述符
        如果返回-1,代表创建失败,提示错误*/
        if ((out_fd = creat(argv[2], COPYMODE)) == -1)
            oops("Cannot creat", argv[2]);
    
        /*cp指令的动作就是读取一个文件的内容到存储器,在新的地址创建空白文件,再从存储器将内容写入新文件。
        这里判断复制是否成功:
        如果能读取顺利,而读取的位数和写的位数不同,是写错误;
        如果读取失败,是读错误。*/
        while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
            if (write(out_fd, buf, n_chars) != n_chars)
                oops("Write error to ", argv[2]);
        if (n_chars == -1)
            oops("Read error from ", argv[1]);
    
        /*这里执行的是关闭文件的动作,in_fd和out_fd两个文件描述符
        所指向的文件只要有一个关闭错误,就提示关闭错误。*/
        if (close(in_fd) == -1 || close(out_fd) == -1)
            oops("Error closing files", "");
    }
    
    /*这个是用来输出错误信息的函数*/
    void oops(char *s1, char *s2)
    {
        fprintf(stderr, "Error: %s ", s1);
        perror(s2);//用来将上一个函数发生错误的原因输出到标准设备(stderr)
        exit(1);
    }
    
    • ls1 ls2
      功能 显示当前目录下的所有文件
      ls2前半部分和ls1一样,不同的是多出来了一部分,用来显示文件的详细信息,比如用户名,群组名,大小,创建时间,读写权限等。

    • who
      主要思想:从UTMP_FILE文件中读取想要的信息到存储器中,然后再用标准输出函数打印到屏幕上,最后关闭文件。

    #include    <stdio.h>
    #include    <stdlib.h>
    #include    <utmp.h>
    #include    <fcntl.h>
    #include    <unistd.h>
    
    #define SHOWHOST    
    
    int show_info( struct utmp *utbufp )
    {
        printf("%-8.8s", utbufp->ut_name);  
        printf(" ");                
        printf("%-8.8s", utbufp->ut_line);  
        printf(" ");                
        printf("%10ld", utbufp->ut_time);   
        printf(" ");                
    #ifdef  SHOWHOST
        printf("(%s)", utbufp->ut_host);    
    #endif
        printf("
    ");               
    
        return 0;
    }
    int main()
    {
        struct utmp  current_record;    
        int     utmpfd;     
        int     reclen = sizeof(current_record);
    
    /*打开UTMP_FILE读取信息,如果打开失败则输出失败信息。*/
        if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
            perror( UTMP_FILE );    
            exit(1);
        }
        /*读取信息到存储器中,reclen就是是读的字节数,然后再调用函数打印出来。*/
        while ( read(utmpfd, &current_record, reclen) == reclen )
            show_info(&current_record);
        close(utmpfd);
        return 0;           
    }
    
    • fileinfo
      功能 显示文件信息,建立了一个stat数据结构。
      先判断命令是否有操作数,有则继续进行,无报错就打印出来相关文件信息。

    问题

    • cp1.c

    在代码中,我发现最开始定义了了一个宏COPYMODE常量。在后面creat函数调用了它

      if ((out_fd = creat(argv[2], COPYMODE)) == -1)   //创建新文件失败
            oops("Cannot creat", argv[2]);
    ```![](http://images2015.cnblogs.com/blog/886975/201612/886975-20161203154300443-1866482060.png)
    
    
    查看creat函数帮助文档后COPYMODE应该是用来定义新文件的访问权限位。
    ![](http://images2015.cnblogs.com/blog/886975/201612/886975-20161203154144756-399421584.png)
    
    testmf.c代码执行完毕后无显示,为了方便知道它已经执行完毕,尝试修改了代码,如下:
    ![](http://images2015.cnblogs.com/blog/886975/201612/886975-20161203160320162-747476751.png)
    
    再次运行可看到finish:![](http://images2015.cnblogs.com/blog/886975/201612/886975-20161203160349756-1117921361.png)
    
    ## 学习进度条
    
    |            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|
    | 目标        | 5000行            |   30篇           | 400小时            |       |
    | 第一周      | 100/100           |   2/2            | 25/25             |  安装了虚拟机并学习掌握核心的linux命令     |
    | 第二周      | 100/200           |   1/3            | 30/55             |    虚拟机上的C语言编程   |
    | 第三周      | 150/350          |   1/4            | 10/65             |    计算机中信息的表示和运算   |
    | 第四周      | 0/350          |   0/4            | 3/68             |    复习前几周内容   |
    | 第五周      | 75/420          |   1/5            | 20/88             |   程序的机器级表示    |
    | 第六周      | 125/545          |   1/6            | 20/108             |   Y86指令 硬件语言控制HCL    |
    | 第七周      | 72/617          |   1/7            | 20/128             |   磁盘 存储器相关结构    |
    | 第八周      | 0/617          |   2/9            | 20/148             |   期中总结    |
    | 第九周      | 185/802          |   2/11            | 25/173             |   系统级的输入输出    |
    | 第十周      | 669/1472          |   2/13            | 20/193             |   重点代码的学习    |
    | 第十一周    | 669/1472          |   2/15            | 35/228             |   process代码的学习    |
    | 第十二周    | 20/1492          |   3/18            | 35/228             |  前几周代码复习    |
    
    
    ## 参考资料
    - [《深入理解计算机系统V2》学习指导]([http://www.cnblogs.com/rocedu/p/5826467.html])
    - [《信息安全系统设计基础》教学进程](http://www.cnblogs.com/rocedu/p/5826112.html)
    - [《深入理解计算机系统》实验](https://www.shiyanlou.com/courses/413)
  • 相关阅读:
    linux学习笔记--文件
    linux学习笔记——基础命令
    nginx实现动静分离
    keepalived+nginx高可用负载均衡环境搭建
    keepalived衡环境搭建
    redis配置文件redis.conf说明
    基于sentinel 的redis集群环境搭建
    jdk动态代理
    spring的事物实现
    Linux用户配置
  • 原文地址:https://www.cnblogs.com/20145201lzx/p/6128785.html
Copyright © 2020-2023  润新知