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\n", *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("\n");               

    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)
posted @ 2016-12-04 19:29  20145201李子璇  阅读(152)  评论(1编辑  收藏  举报