课堂实践myod
- 要求:
-
参考教材第十章内容
-
用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
运行截图:
- 实践中遇到的问题:
- 运行出现错误提示:段错误(核心已转储)
解决方法:
1>使用demsg命令查看:dmesg 可以在应用程序崩溃时,显示内存中保存的相关信息。如下所示,通过 dmesg 命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。
2>使用gdb调试
找到错误出现在代码中定义buf变量的部分,对buf变量只定义为指针,没有对其存储空间具体限定,之后将char *buf
改为
char buf[1024]
- 运行程序后出现乱码
解决方案:将代码中循环读取文件中的字符的条件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指令源代码