2017-2018-1 20155332 《信息安全系统设计基础》第四周学习总结
课堂实践项目——myod第二版(系统功能调用)
任务要求
1 参考教材第十章内容
2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
3 不要把代码都写入main函数中
4 要分模块,不要把代码都写入一个.c中
5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6 课上上传代码到码云
解决过程
上周就做过myod的程序,这次只用把打开文件,读取文件,关闭文件的命令全部换成系统命令即可,并不困难。
- FILE *file=fopen(argv[3],"r")——int fd=open(argv[3],O_RDONLY,0);;
- fgets(ch,17,file)——read(fd,&ch,BUFFERSIZE)
- fclose(file)——改为close(fd);
#include<stdio.h>
#include<unistd.h>
void myod(int fd,int n1,int n2,int n3,int n4)
{
char ch,line[16];
int i;
int a=0;
int j=0;
while(read(fd,&ch,1)!=0){
line[j%16]=ch;
if((j+1)%16==0){
printf("%07o ",16*a);
a++;
if(n1){for(i=0;i<16;i++)
{
if(line[i]=='
')
{printf("%5s","\n");continue;}
if(line[i]==' ')
{printf("%5s","\t");continue;}
putchar(line[i]);
putchar(' ');
putchar(' ');
putchar(' ');
putchar(' ');
}
putchar('
');}
if(n2){printf(" ");for(i=0;i<16;i++)
{
if(line[i]=='
')
{printf("0%-4x",'
');continue;}
if(line[i]==' ')
{printf("0%-4x",' ');continue;}
printf("%-5x",line[i]);
}
putchar('
');
}
if(n3){printf(" ");for(i=0;i<16;i++)
{
if(line[i]=='
')
{printf("%-5d",'
');continue;}
if(line[i]==' ')
{printf("%-5d",' ');continue;}
printf("%-5d",line[i]);
}
putchar('
');
}
if(n4){printf(" ");for(i=0;i<16;i++)
{
if(line[i]=='
')
{printf("%-5o",'
');continue;}
if(line[i]==' ')
{printf("%-5o",' ');continue;}
printf("%-5o",line[i]);
}
putchar('
');
}
}
j++;
}
}
学习两条重要命令
man -k head | grep file| grep 2
grep -nr O_RDONLY /usr/include
myhead/mytail码云链接
https://gitee.com/bestiisjava2017/laura5332/commit/6f2c00fa96b049cec64548a97c6150a6b6e828d2
完成head,tail的使用
自己实现
- head命令是打印一个文件的前十行内容
- tail命令是打印一个文件的后十行内容
- 实现时,先打开一个文件,再用读取文件内容。
- head从前往后,读10个换行符,结束,然后输出每行的内容
- tail从后往前,读取10个换行符,结束,然后输出每行的内容
- 关闭文件
myhead
mytail