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

本文介绍了使用Linux IO系统调用实现类似od命令功能的过程,包括遇到的段错误问题及解决办法,同时提供了head和tail命令的实现思路与伪代码。

课堂实践myod

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

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

运行截图:
1065404-20171012200100902-1864841019.png

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

1065404-20171012195034371-1955709150.jpg

解决方法:

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

1065404-20171012195058496-1439311782.jpg

2>使用gdb调试

1065404-20171012195114918-22792324.jpg

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

  1. 运行程序后出现乱码
    1065404-20171012195138262-1005619077.jpg

解决方案:将代码中循环读取文件中的字符的条件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)
}
运行截图:

1065404-20171012200122137-1475444986.png

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

1065404-20171012200138152-1425342731.png

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

课下实践的体会

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

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

转载于:https://www.cnblogs.com/xhwh/p/7657828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值