zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)

    2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail实现)

    课堂实践内容

    1 参考教材第十章内容

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

    1. 不要把代码都写入main函数中

    2. 要分模块,不要把代码都写入一个.c中

    5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

    6 课上上传代码到码云

    实现修改过程

    1.我首先学会使用man命令,可通过man -k key1| grep key2| grep key3| ...实现多关键字查找,然后通过man 数字 key找到具体的应用手册内容,我通过输入如下:


    找到了read函数的头文件为#include<unistd.h>及所需传的参数,ssize_t read(int fd,void *buf,size_t n) ,它的返回值是成功则返回读的字节数,EOF则为0。

    同理可查到函数open()的使用方法。

    2.命令行传参,main函数的两个参数:

    • argc记录了用户在运行程序的命令行中输入的参数的个数。
    • arg[]指向的数组中至少有一个字符指针,即arg[0].它通常指向程序中的可执行文件的文件名。

    3.修改第二周编写的myod函数后如下:

    代码链接

    4.运行结果为:

    head、tail命令的实现

      1. 首先弄明白head和tail命令的功能,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 是档案的结尾
        head [参数] [文件] ,默认head命令打印其相应文件的开头10行
    • 命令参数

    -q 隐藏文件名

    -v 显示文件名

    -c 显示字节数

    -n 显示的行数

    3.伪代码:

    • 打开并读入成一个数组
    • 选择是tail还是head
    • 编写myhead,mytail利用循环输出默认10行,完成基本功能

    产品代码

    head.c

    #include "head.h"
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    int main(int argc ,char *argv[]){
    int fd;
    int len;
    int arg;
    int flags;
    flags=argc;
    //if(argc==5){
    //arg=(int)argv[3]-48;
    //}
    //else{
     arg=10;
    //}
    char STR[10000],filename[100];
    fd=open(argv[flags-1],O_RDONLY,0);
     if(fd==-1){
         //printf("Fail to open the file");
               perror(argv[flags-1]);
               exit(1);
    }
     len=read(fd,&STR,10000);
     if(strcmp(argv[1],"head")==0){
            if(argc==3){
    	// if(strcmp(argv[2],"-n")==0){
         myhead(STR,len,arg);
     //}
        }
    //else myhead(STR,len,arg);
     }
     if(strcmp(argv[1],"tail")==0){
           if(argc==3){
          mytail(STR,len,arg);
    }
    }
      close(fd);
    }
    
    
    

    myhead.c

    #include "head.h"
    #include<stdio.h>
    #include<stdlib.h>
    
    void myhead(char STR[],int len,int arg){
    int i,n;
    for(i=0,n=0;i<len,n<arg;i++){
        if(STR[i]=='
    '){
                n++;
            printf("
    ");
          }
        else{
             printf("%c",STR[i]);
            // putchar(STR[i]);
           }
    }
    }    
    
    

    head.h

    #ifndef HEAD_H
    
    #define HEAD_H
    
    #include<stdio.h>
    
    #include<stdlib.h>
    
    #include<string.h>
    
    void myhead(char STR[],int len,int arg);
    
    void mytail(char STR[],int len,int arg);
    
    #endif
    
    
    • head的代码,运行结果为:

    编程中遇到的问题

    • 问题1:在编写中遇到了如下情况:

    • 解决1:通过检查我发现,我在head.h中和对myhead.h中参数类型的定义有一个是不一致的


    修改后出现了错误2

    • 问题2:显示找不到路径和文件

    • 解决2:我通过单步调试发现根本进入不了这个文件,发现在调用参数时,文件名不是argv[1],改为argv[3]后可以进入目标文件了

    • 问题3:运行不出任何结果,编译也未出现任何错误。

    • 解决3:发现我犯了一个低级错误,虽然我注意到字符串的比较不能用,必须要用strmp()0才能保证进入。

    代码托管

    mytail实现

    • 学习mytail的功能

    • 其功能是将文件的后10行打印到标准输出

    • mytail的实现与myhead非常类似,只需加一个mytail.c就够了,在此就不详细叙述了

    #include "head.h"
    #include<stdio.h>
    #include<stdlib.h>
    
    void mytail(char STR[],int len,int arg){
    int i,n;
    int count;
    int k,j;
    for(count=0,k=0;k<len;count++,k++){
             if(STR[i]=='
    '){
                 count++;
             }
     }     
    
    
    for(n=0,i=0;i<len;i++){
       if(STR[i]=='
    '){
               n++;
            
          }
     if(n==count-10){
         for(k=i+1;k<len;k++){
              if(STR[k]=='
    '){
               n++;
            printf("
    ");
          }
                    
        else{
             printf("%c",STR[k]);
            
            }
         }
      }    
     }
    } 
    
    
    • 实现结果

    总结感悟

    感觉以前java要求掌握的一些知识,像命令行参数传入等还需要巩固。而且许多知识感觉仍然需要时间,虽然最近学习的过程比较辛苦,但是感觉收获还是不错的。

  • 相关阅读:
    学习的原动力
    “六顶思考帽”给我的启示
    关于DataSet与Strongly typed DataSet几点思考(原创)
    设计模式之Singleton和Factory
    CentOS修改网络配置
    Proxmox VE(PVE)安装教程
    CentOS开启SELinux导致samba无法访问的解决办法
    nano编辑器使用教程
    CentOS 如何挂载硬盘
    PVE硬盘直通
  • 原文地址:https://www.cnblogs.com/ljq1997/p/7673782.html
Copyright © 2011-2022 走看看