• 2017-2018-1 20155330 《信息安全系统设计基础》第4周学习总结


    2017-2018-1 20155330 《信息安全系统设计基础》第四周学习总结

    课堂实践

    myod-系统调用版本

    1. 参考教材第十章内容
    2. 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
    3. 不要把代码都写入main函数中
    4. 要分模块,不要把代码都写入一个.c中
    5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

    思路及修改过程

    首先可以确定的是od函数无需修改,需要达成条件主要在主函数中。
    由课本第十章知识可知,需要修改的有文件指针、打开/关闭文件以及读取文件的函数。

    原主函数

    int main()	
    {
       	FILE *fp;
        char ch[N],name[N];
        int i=0;
        printf("Input file name:");
        scanf("%s",name);
        if((fp=fopen(name,"r"))==NULL)
        {
            printf("ERROR!");
            exit(0);
        }
        while(fgets(ch,17,fp))
        {
            od(ch,i++);
        }
        fclose(fp);
    
    }
    
    

    需修改的部分

    1. int main() 将主函数改为调用参数形式,即int main(int argc,char *argv[])
    2. FILE *fp 删除文件指针。
    3. 将提示输入文件名和获取文件名的代码删除。
    4. 根据课本知识,可建立一个整型变量用于取得文件打开后的返回值,即int fd。以只读方式打开已存在文件则有fd=open(argv[1],O_RDONLY),当open()返回值为-1时打开文件失败。
    5. 循环体条件由fgets(ch,17,fp)更改为read(fd,ch,16)==16即从描述符为fd的当前文件位置复制最多16个字节到内存位置ch中。
    6. 最后用close()函数关闭文件即可。
    7. 除此之外,还需要对头文件进行修改,即增加包含以上函数的相关头文件。

    修改后的主函数

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #define N 100
    #define M 17
    int main(int argc, char *argv[])
    {
        //FILE *fp;
        int fd,i=0;
        char ch[N],name[N],ch;
        fd=open(argv[1],O_RDONLY);
        if(fd==-1)
        {
            printf("ERROR!");
            exit(0);
        }
        while(read(fd,ch,16)==16)
        {
            od(ch,i++);
        }
        close(fd);
    }
    

    遇到的问题及解决过程

    一开始循环体内条件为read(fd,ch,16)!=0,虽然在运行过程中没有出错,但在仔细阅读课本内容后发现,read函数的返回值存在三种情况:

    1. 返回值为-1 表示一个错误
    2. 返回值为0 表示EOF
    3. 返回值为一个数 表示实际传送的字节数量
      由于已知od -tc -tx1命令中一行只能输出16个字节的字符,则判断条件应控制为传送16个字节,所以最后将read(fd,ch,16)!=0修改为read(fd,ch,16)==16

    运行结果

    课后练习:head,tail的使用

    首先我们需要知道head命令和tail分别是用来做什么的。

    1. head

      • 首先使用man -k head命令查看系统调用中的head
      • 利用man -k key1| grep key2| grep key3| ...缩小查找范围,这里使用的是man -k head | grep file
      • 可以发现head(1)是我们需要查看的内容
      • 最后利用man 1 head查看head的相关信息,可以知道head命令默认是查看文件的前10行:

      主要功能:

      功能
      c 输出文件前num个字节
      c -X 输出文件除最后几个字节外的所有内容
      n 输出文件前n行内容
      n -X 输出文件除最后几行外的所有内容
      q 隐藏文件名
      v 始终显示文件名
    2. tail

      查看tail命令的方式与head命令相同,以下是tail命令的主要功能。

    用C语言实现head命令中-n的功能

    1. 伪代码
    int main(int argc,char *argv[])
    {
    	命令行设置指定输出的前n行行数;
    	while(!feof(fp))
    	{
    		if(i<n)
    		{
    			按行读取文件;
    			输出;
    			i++;
    		}
    		else break;
    	}
    }
    
    • 运行结果与head命令结果的比较

    代码调试中的问题和解决过程

    • 问题1:在运行head命令相关文件后发现虽然按要求输出了指定行数的内容,但是程序并没有停止。
    • 问题1解决方案:通过if...else语句对程序的进程进行了控制,当达到循环条件时,语句跳转到else部分,else语句中添加break停止程序进程,跳出循环。

    代码托管

    上周考试错题总结

    无。

    结对及互评

    本周结对学习情况

    - [20155321](http://www.cnblogs.com/rafell/p/7653257.html)
    - 结对学习内容
        - myod系统调用
        - 第十章
        - head、tail命令的使用
    

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/1 10/10
    第二周 63/63 1/2 8/18
    第三周 31/94 1/3 18/36
    第四周 265/329 1/4 17/53

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:10小时

    • 实际学习时间:17小时

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    Socket
    属性的使用案例
    link.bat
    未命名 (2)
    解决wordpress3.5更新插件和主题失败的问题
    解除文件锁定(此文件来自其他计算机,可能被阻止以保护该计算机)
    String转换成Integer源码分析
    实战体会Java多线程编程精要
    JAVA进阶:一个简单Thread缓冲池的实现
    Java对象的序列化和反序列化实践
  • 原文地址:https://www.cnblogs.com/ashin-kl/p/7654711.html
Copyright © 2020-2023  润新知