2017-2018-1 20155328 《信息安全系统设计基础》第四周学习总结
课堂提交补充
用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能(XXX为文件名,通过命令行传入。)
在之前的myod基础上,使用了系统调用的open和read函数。使用前查询如下:
更改main.c的代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"head.h"
#define N 300
main(int argc,char *argv[])
{
char a[N];
int i,fd,n;
if ( (fd = open(argv[3], O_RDONLY)) == -1 )
{
perror(argv[3]);
exit(1);
}
n=read(fd, a, N);
myod(a,n);
close(fd);
}
myod.c的代码如下:
#include<stdio.h>
#include"head.h"
void myod(char *a,int n)
{
int i,j;
char b[16];
for(i=0;i<n;i++){
if(i%16==0) printf("%07o\t",16*i);
printf("%c ",a[i]);
if((i%16==15)||(i==n-1)){
printf("\n");
for(j=0;j<16;j++)
{
b[j]=a[i-15+j];
printf("%x ",b[j]);
}
printf("\n");
}
}
}
运行myod截图如下:
-
遇到的问题1:在Linux中运行时提示“段错误(核心已转储)”。
-
解决方法:询问遇到过这个问题的同学,同学说她的问题是因为数组越界才提示段错误,仔细检查程序后发现并未出现越界问题。后去百度,发现是自己在linux中运行时忘了带参数...
-
遇到的问题2:运行程序后没有显示输出。
-
解决方法:查看myod.c的输出部分,发现自己将后引号打到了b[j]后面...修改后输出正常。
head和tail的相关使用
在Linux中,head+文件名的功能为打印出文件的前十行,tail+文件名的功能为打印出文件的后十行。在终端试了一下这两个命令,效果如图:
编写代码如下:
main.c:
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"head.h"
#define N 300
main(int argc,char *argv[])
{
char ch[N];
int i,fd,n;
if ( (fd = open(argv[1], O_RDONLY)) == -1 )
{
perror(argv[1]);
exit(1);
}
n=read(fd,ch,N);
ihead(ch,n);
close(fd);
}
ihead.c:
#include <stdio.h>
#include"head.h"
ihead(char *ch[],int n)
{
int i,count=0;
for(i=0;i<n,count<10;i++)
{
if (ch[i]!='\n') printf("%c",ch[i]);
else
{
count++;
printf("\n");
}
}
}
码云链接:20155328张钰清