1. 程式人生 > >2018-2019 20165215 《信息安全系統設計基礎》第六周學習總結

2018-2019 20165215 《信息安全系統設計基礎》第六周學習總結

調用 cout 磁盤 grep 語言 根據 shell system stdio.h

2018-2019 20165215 《信息安全系統設計基礎》第六周學習總結


Linux系統調用學習

操作系統(Operating System,簡稱OS)完成的工作比喻為兩個角色:服務生和管家婆

  • 管家婆:
    • 通過「文件」對I/O設備進行了抽象
    • 通過「虛存」對主存和I/O設備進行了抽象
    • 通過「進程」對CPU、主存和I/O設備進行了抽象
  • 服務生:
    • GUI:為小白用戶提供服務,你只會用鼠標就可以使用操作系統
    • Shell: 為高級用戶提供服務,你要記憶系統命令,更多通過鍵盤使用操作系統
    • 系統調用:為專業用戶程序員提供服務,你可以創建自己的工具讓大家更好的使用操作系統

兩個重要命令:

  • man -k key1|grep key2|...
    根據關鍵字檢索系統調用
  • grep -nr XXXX /usr/incldue查找相關的宏定義,結構體定義,類型定義等

其它知識點

  • man -k +函數名搜索函數信息
  • man +數字+函數查到相關的命令和函數
  • cat+文件名稱查看文本文件內容
  • od +文件名稱查看二進制文件內容
  • SEE ALSO中得到相關系統調用的信息

使用c語言實現who命令:

技術分享圖片

系統級I/O

  • 輸入/輸出(I/O)是在主存和外部設備之間復制數據的過程
  • 文本文件是只含有ASCII或Unicode字符的普通文件;二進制文件是所有其他的文件。對內核而言,文本文件和二進制文件沒有區別
  • 調用open函數來打開一個已存在的文件或者創建一個新文件的
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(char *filename, int falgs, mode_t mode); 
/*  成功則返回新文件描述符,出錯返回-1;
    char *filename:函數將filename轉換為一個文件描述符,並返回描述符數字;返回的描述符總是在進程中當前沒有打開的最小描述符;
    int flags:指明進程打算如何訪問這個文件;
    mode_t mode:指定了新文件的訪問權限位。
*/
  • 調用close函數關閉一個打開的文件
#include <unistd.h>

int close(int fd);
/*  成功則返回0,出錯則為-1。 */
  • 通過分別調用read和write函數來執行輸入和輸出
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t n);
/* 成功則返回讀的字節數,若EOF則為0,若出錯則為-1。  */

ssize_t write(int fd, const void *buf, size_t n);
/*  成功則返回寫的字節數,若出錯則為-1。  */
  • 在x86-64系統中,size_t被定義為un-signed long,而ssize_t被定義為long
  • 內核用描述符表、文件表和v-node表這三個相關的數據結構來表示打開的文件;程序剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤,如果此時去打開一個新的文件,它的文件描述符會是3;不同的文件描述符也會指向同一個文件

技術分享圖片

  • 重定向的兩種方式:
    • linux>ls>foo.txt使得shell加載和執行ls程序,將標準輸出重定向到磁盤文件foo.txt
    • 使用dup2函數,復制描述符表表項oldfd到描述符表表項newfd,覆蓋描述符表表項newfd
    #include<unistd.h>
    
    int dup2(int oldfd,int newfd);
    /*返回,若成功則為非負的描述符,若出錯則為-1*/

    head,tail的使用

    通過man headman tail查詢可知head、tail的作用分別是顯示一個文件的前十行和後十行

技術分享圖片

技術分享圖片

一、偽代碼:

  • head
void main( ){
   計數標誌 count=0;
    循環按字符讀入文件
    {
        輸出字符; 
        if(讀入字符為回車符){cout++;}
        if(count==10){退出循環}
    }
}
  • tail
void main(){
    統計文件總行數n;
    計數標誌 count=0
    循環按字符讀入文件
    {
       if(讀入字符為回車符){cout++;}
       if(count>=n-10){
           輸出字符
       }
    }
}

二、產品代碼

  • head
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc,char *argv[])
{

    int count=0;
    char ch;
    int fd=0;

    fd=open(argv[argc-1],O_RDONLY,0);  
    if(fd==-1){printf("Error!\n");exit(1);}

    while(read(fd,&ch,1)!=0)
    {
        putchar(ch); 
        if(ch == ‘\n‘){count++;}
        if(count == 10){break;}
    }

    close(fd);

    return 0;
}
  • tail
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int  ct(int fd)
{
    int count=0;
    char c;
    while(read(fd,&c,1)!=0)
    {
       if(c == ‘\n‘)
        count++;
    }
    return count;
}
void mh(int fd,int n)
{
    int count=0;
    char c;
    while (read(fd, &c, 1)!=0) {
           if (c==‘\n‘) {
           count++;
           }
           if (count>=n-10) {
           putchar(c);
           }
    }
}
int main()
{
    int fd=0,ft=0;
    int count;
    fd=open("aaa.txt",O_RDONLY);
    count=ct(fd);
    close(fd);
    ft=open("aaa.txt",O_RDONLY);
    mh(fd,count);
    close(ft);
    return 0;
}

運行截圖:

技術分享圖片

2018-2019 20165215 《信息安全系統設計基礎》第六周學習總結