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

课堂实践myod

  • 要求:
  1. 参考教材第十章内容

  2. 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名

运行截图:

  • 实践中遇到的问题:
  1. 运行出现错误提示:段错误(核心已转储)

解决方法:

1>使用demsg命令查看:dmesg 可以在应用程序崩溃时,显示内存中保存的相关信息。如下所示,通过 dmesg 命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。

2>使用gdb调试

找到错误出现在代码中定义buf变量的部分,对buf变量只定义为指针,没有对其存储空间具体限定,之后将char *buf改为
char buf[1024]

  1. 运行程序后出现乱码

解决方案:将代码中循环读取文件中的字符的条件while(read(fd,buf,16))改为
while(read(fd,buf,16)!=0)

课后练习:head、tail

  • head指令是用来查看文件内容的;例如:
    head -5 20155203.txt可以用来查看20155203.txt文件中的前五行

  • tail指令是用来查看文件的后几行代码以及文件的更新;
    tail -5 20155203.txt用来查看20155203.txt文件的后五行。

  • head.c伪代码

int head()
{
    对传入参数进行筛选和转换,参数由字符串转换为整型l。
    do
    {
        依次读取文件中字符c;
        输出字符c;
        得到c为回车符时,int i++;
        
    }while(i<l)
}
运行截图:

  • tail.c伪代码
int tail()
{
    通过函数lines得到文件行数
    对参数l的转换同head.c
    do
    {
        依次读取字符,读到'
'即int j++;
        读到j=lines-l时输出读取字符
    }
}
运行截图:

在编写tail.c时遇到了无法运行的问题。是在c文件编译运行通过后,只出现光标闪烁但是没有运行结果的问题,在上网查阅了fgetc()函数的具体内容后发现是用lines(FILE *file)函数统计行数后,光标移动到了文件的最后所以无法再次进行读取,之后对这一部分的代码进行了修改,在行数统计完成的同时关闭文件,并再次打开,这样的重复操作属于此次编写的一个问题,后续还会修改。

课下实践的体会

通过课下实践进一步理解了写指令实现代码的技巧,增加了对指令的了解以及思考。

参考资料:
如何查看linux指令源代码

原文地址:https://www.cnblogs.com/xhwh/p/7657828.html