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张钰清