1. 程式人生 > >2018-2019-1 20165221 《資訊安全系統設計》第六週學習總結

2018-2019-1 20165221 《資訊安全系統設計》第六週學習總結

2018-2019-1 20165221 《資訊安全系統設計》第六週學習總結

知識點總結

理論知識

  • 作業系統完成的「硬體相關、應用無關」的工作比喻成兩個角色:
管家婆
服務生
  • 作業系統通過三抽象概念完成了「管家婆」的功能:

    header 1 | header 2
    ---|---
    抽象一| 通過「檔案」對I/O裝置進行了抽象
    抽象二| 通過「虛存」對主存和I/O裝置進行了抽象
    抽象三| 通過「程序」對CPU、主存和I/O裝置進行了抽象

who命令如何使用

  • 可以檢視當前登入的賬戶,終端和近期的登陸時間
  • 鍵入man 1 who可以具體檢視該命令的用法
  • who命令的其他幾種形式:

    header 1 | header 2
    ---|---
    形式1 | ```whoami```
    形式2| ```who am i```
    形式3| ```who mom likes```
  • who的幫助文件提供了重要的資訊:
    If FILE is no specified, use /var/run/utmp,/var/log/wtmp as FILE is common.
  • 下面進行具體檢視和捕捉


    由此證實關於utmp是一條記錄,一條記錄組成的檔案的猜想。
  • 找到實現who命令的程式碼:

    如何自己編寫who命令

  • 具體程式碼:
#include    <stdio.h>
#include    <stdlib.h>
#include    <utmp.h>
#include    <fcntl.h>
#include    <unistd.h>

int show_info( struct utmp *utbufp )
{
    printf("%-8.8s", utbufp->ut_name);  
    printf(" ");                
    printf("%-8.8s", utbufp->ut_line);  
    printf(" ");                
    printf("%10ld", utbufp->ut_time);   
    printf("\n");               
    return 0;
}

int main()
{
    struct utmp  current_record;    
    int     utmpfd;     
    int     reclen = sizeof(current_record);
    //開啟utmp 檔案
    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
        perror( UTMP_FILE );    
        exit(1);
    }

    //讀取utmp中的每一條記錄
    while ( read(utmpfd, &current_record, reclen) == reclen )
        //顯示記錄中的相關資訊
        show_info(&current_record);
 
    //關閉utmp檔案
    close(utmpfd);
    return 0;           
}

學習linux系統程式設計的方法

  • 仔細研究manpages
  • 問題驅動,使用man -k key1|grep key2|...在manpages中搜索你要的內容
  • 閱讀.h檔案: 可以通過grep -nr XXXX /usr/incldue查詢相關的巨集定義,結構體定義,型別定義等
  • 解決一個問題要多個系統呼叫,可以參考manpagesSEE ALSO部分來得到相關係統呼叫的資訊

  • 文字檔案易讀取,佔位置;二進位制檔案靈活易儲存,讀取難

    參考資料

  • 別出心裁的Linux系統呼叫學習法
  • 文字檔案與二進位制檔案區別
  • linux下如何編寫who命令