2017-2018-1 20155228 《信息安全系統設計基礎》第四周學習總結

2017-2018-1 20155228 《信息安全系統設計基礎》第四周學習總結

myod-系統調用版本

題目和要求

  1. 參考教材第十章內容
  2. 用Linux IO相關係統調用編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能,注意XXX是文件名,經過命令行傳入,不要讓用戶輸入文件名
  3. 不要把代碼都寫入main函數中
  4. 要分模塊,不要把代碼都寫入一個.c中
  5. 提交測試代碼和運行結果截圖, 提交調試過程截圖,要全屏,包含本身的學號信息
  6. 課上上傳代碼到碼雲

分析和設計

關於linux中的od命令的分析

od -tx -tc /*選項和參數*/ hello.c /*當前目錄下的文件的名字*/
選項 參數 解釋
- A o 指定地址基數爲八進制(系統默認)
- A d 指定地址基數爲十進制
- A x 指定地址基數爲十六進制
- A n 不打印位移值
- t c 指定數據的顯示格式爲ASCII字符或反斜槓序列
- t o 指定數據的顯示格式爲八進制(系統默認)
- t d 指定數據的顯示格式爲有符號十進制數
- t u 指定數據的顯示格式爲無符號十進制數
- t f 指定數據的顯示格式爲浮點數
- t x 指定數據的顯示格式爲十六進制數

在選項-t中除了參數c,其餘參數均可在後面加上一個十進制數n,用來指定連續顯示的字節數量html

關於系統調用的指令

  • myod中須要用到的系統調用指令有三個
    1. 打開文件函數
    int open(char *filename,int flags,mode_t mode);
    //int是文件描述符,文件打開失敗時爲-1,char *filename是文件路徑,int flags是文件訪問方式,包括只讀只寫讀寫,mode_t mode是文件訪問權限
    使用這個函數時須要添加的頭文件:
    #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
    1. 讀取文件字符函數
    ssize_t read(int fd,const void *buf,size_t n);
    //ssize_t是讀的字節數,讀不到字符(EOF)的時候爲0,出錯時爲-1,int fd是文件描述符,const void *buf是把讀到的字符放到指針buf所指的內存空間
    使用這個函數時須要添加的頭文件:
    #include <unistd.h>
    1. 關閉文件函數
    int close(int fd);
    //int在關閉文件成時爲0,關閉文件失敗時爲-1,int fd是文件描述符
    使用這個函數時須要添加的頭文件:
    #include <unistd.h>

代碼和結果

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int m,n;
openfile(char *filename);
closefile();
void main(int argc,char *argv[])
{
  
  char temp;
  char ch[8];
  int count1=0;
  int count2=0;
  openfile(argv[1]);
  while(read(m,&temp,1)!=0)
  {
    
    if(count1<7)
    {
      if(count1==0)
      printf("     ");
      printf("%4x ",temp);
      ch[count1]=temp;
      count1++;
      count2++;
    }
    else
    {
      printf("%4x ",temp);
      ch[count1]=temp;
      count1++;
      count2++;
      
      printf("\n");
      printf("%4d ",count2);
      for(int i=0;i<8;i++)
      {
        if(ch[i]=='\n')
        {
          printf("  \\n ");
        }
        else
        {
          printf("%4c ",ch[i]);
        }
      }
      printf("\n");
      count1=0;
    }
  }
  if(count1!=0)
  {
    printf("\n%4d ",count2);
    for(int i=0;i<count1;i++)
      {
        if(ch[i]=='\n')
        {
          printf("  \\n ");
        }
        else
        {
          printf("%4c ",ch[i]);
        }
      }
    printf("\n");
  }
  closefile();
}
openfile(char *filename)
{
  m=open(filename,O_RDONLY,0);
  if(m==-1)
  {
    printf("file open faild!\n");
  }
  /*else
  {
    printf("file open successful!\n");
  }*/
}
closefile()
{
  n=close(m);
  if(n==-1)
  {
    printf("file close faild!\n");
  }
  /*else
  {
    printf("file close successful!\n");
  }*/
}

問題和解決

關於輸出打印排版的問題

  • 問題:在od -tx1 -tc hello.c中,每行打印16個字符,每行開頭還有統計總的字符個數
  • 解決:在myod中,用conut1來控制每行打印8個字符,用count2統計總的字符個數
  • 問題:在od -tx1 -tc hello.c中,打印格式是一行ascii碼和一行字符相互對應
  • 解決:在myod中,用conut1來控制每行打印8個字符,每打印一個字符的ascii碼就用ch數組記錄這個字符,當打印8個字符的ascii碼以後,就換行打印ch數組中的8個字符

關於直接在命令中傳參的問題

void main(int argc,char *argv[])
  • 若是想要直接在命令行中傳參而不是運行程序再輸參數,主函數就必須套用上面這種格式
  • int argc是輸入參數的個數
  • char *argv是各個輸入的參數,一個參數一個字符串
  • 嗨呀好氣呀我以前不知道必需要寫成這種格式我還覺得能夠本身設定mian函數的輸入格式搞了半天老是文件打開失敗我都想砸電腦了
  • 我後來去翻大佬們的博客發現你們都寫成這個格式我最初還覺得你們都是抄同一我的的代碼因此參數都同樣結果上網查了才知道必須這樣寫
  • 詳細分析:int main(int argc,char* argv[])詳解

教材學習內容總結

第十章 系統級I/O

Linux提供了少許的基於Unix I/O模型的系統級函數.它們容許應用程序打開、關閉、讀和寫文件,提取文件的元數據,以及執行I/ O重定向。Linux的讀和寫操做會出現不足值,應用程序必須能正確地預計和處理這種狀況。應用程序不該直接調用Unix I/O函數,而應該使用RIO包,RIO包經過反覆執行讀寫操做,直到傳送完全部的請求數據,自動處理不足值。Linux內核使用三個相關的數據結構來表示打開的文件。描述符表中的表項指向打開文件表中的表項,而打開文件表中的表項又指向v-node表中的表項。每一個進程都有它本身單獨的描述符表,而全部的進程共享同一個打開文件表和v-node表。理解這些結構的通常組成就能使咱們清楚地理解文件共享和I/O重定向。標準I/()庫是基於Unix I/O實現的,並提供了一組強大的高級I/O例程。對於大多數應用程序而言,標準I/ O更簡單,是優於Unix I/O的選擇。然而,由於對標準I/O和網絡文件的一些相互不兼容的限制,Unix I/O比之標準I/O更該適用於網絡應用程序。node

附錄A 錯誤處理

#include "csapp.h"
void unix_error(char *msg)
void posix_error(int code,char *msg);
void gai_error(int code,char *msg);
void app_error(char *msg);

unix_error, posix_error和gai_error函數報告Unix風格的錯誤、Posix風格的錯誤和GAI風格的錯誤,而後終止。包括app_error函數是爲了方便報告應用錯誤。它只是簡單地打印它的輸人,而後終止。linux

完成head,tail的使用,相關API的分析,僞代碼,產品代碼,測試代碼的編寫

分析和設計

headtail命令的分析

  • head命令用來查看文件的前幾行內容,默認是查看前10行的內容,也能夠設置一個數字改變查看行數
head hello.c/*當前目錄下的文件名稱*/
head -20 hello.c
  • tail命令用來查看文件的最後幾行內容,默認是查看最後10行的內容,一樣,也能夠設置一個數字改變查看行數
tail -20 hello.c

代碼和結果

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>

int m,n;
void fileopen(char *filename);
void fileclose();
void main(int argc,char *argv[])
{
  char temp;
  int count1,count2;
  count2=0;
  count1=atoi(argv[1]);
  fileopen(argv[2]);
  while(read(m,&temp,1)!=0)
  {
    if(temp=='\n')
    {
      count2++;
      if(count2==count1)
      {
        goto A;
      }
      else
      {
        printf("%c",temp);
      }
    }
    else
    {
      printf("%c",temp);
    }
  }
  A:
  printf("\n");
  fileclose;
  
}
void fileopen(char *filename)
{
  m=open(filename,O_RDONLY,0);
  if(m==-1)
  {
    printf("file open faild!\n");
  }
}

void fileclose()
{
  n=close(m);
  if(n==-1)
  {
    printf("file close faild!\n");
  }
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>

int m,n;
void fileopen(char *filename);
void fileclose();
void main(int argc,char *argv[])
{
  char temp;
  int count1,count2;
  count2=0;
  count1=atoi(argv[1]);
  fileopen(argv[2]);
  while(read(m,&temp,1)!=0)
  {
    if(temp=='\n')
    {
      count2++;
    }
  }
  //printf("count2=%d\n",count2);
  count2=count2-count1;
  count1=0;
  fileclose;
  fileopen(argv[2]);
  while(read(m,&temp,1)!=0)
  {
    if(temp=='\n')
    {
      count1++;
    }
    //printf("count1=%d\n",count1);
    if(count1>=count2)
    {
      printf("%c",temp);
    }
  }
  printf("\n");
  fileclose;
}
void fileopen(char *filename)
{
  m=open(filename,O_RDONLY,0);
  if(m==-1)
  {
    printf("file open faild!\n");
  }
}

void fileclose()
{
  n=close(m);
  if(n==-1)
  {
    printf("file close faild!\n");
  }
}

問題和解決

關於在命令行傳參時將字符串轉爲數字

  • 問題:headtail有兩個參數,一個是數字(行數)一個是字符串(地址),可是main(int argc,char *argv[])傳參都是字符串
  • 解決:使用#include <stdlib.h>中的count1=atoi(argv[1]);函數把字符串轉成數字
  • 詳細分析:C語言字符串與數字相互轉換

代碼託管

在Ubuntu上安裝CodeBlocks

本週結對學習狀況

- [201552222](http://www.cnblogs.com/20155222lzj/))

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 10/10 1/1 6/12
第三週 220/230 2/3 6/18
第四周 270/500 1/4 6/24

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。git

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法ubuntu

  • 計劃學習時間:6小時api

  • 實際學習時間:6小時數組

(有空多看看現代軟件工程 課件 軟件工程師能力自我評價表)安全

參考資料

相關文章
相關標籤/搜索