20145319 《信息安全系統設計基礎》第十週補充

20145319 《信息安全系統設計基礎》第十週補充

一 課後代碼分析補充

  • echostate.c&setecho.c:
    • tcgetattr(int fd, & termios info)函數:用於獲取和終端相關的參數賦給info
    • tcsetattr(int fd, int actions,&termios info):設置與終端相關的參數,actions參數決定修改何時生效,TCSANOW爲改變當即發生
    • 結構體termios:是在POSIX規範中定義的標準接口,用於存儲一些和終端接口相關的信息
    • man -k terminal|grep set|grep 1能夠找到系統自帶的設置終端屬性命令sttystty echo即打開echo.stty -echo關閉echo
    • 爲了仔細觀察在開關echo時c_lflagc_lflag|ECHOc_lflag&~ECHO的值的變化,編寫一個echotest將三者值輸出出來,當echo打開時三者值以下:
    • 使用stty將echo關閉時,三者的值:
      • 可見不管echo是打開仍是關閉,c_lflag|ECHOc_lflag&~ECHO的值始終沒有改變,不過具體緣由尚未想清楚,要繼續查詢或者GDB調試或許能更清楚具體是怎麼變化的node

  • filesize&fileinfo:
    • 關於文件大小,權限,時間等操做一般與結構體stat有關
    • stat結構體具體以下:linux

      struct stat {   
            mode_t     st_mode;    //文件訪問權限   
                    ino_t      st_ino;     //索引節點號   
                    dev_t      st_dev;     //文件使用的設備號   
                    dev_t      st_rdev;     //設備文件的設備號   
                    nlink_t    st_nlink;    //文件的硬鏈接數   
            uid_t      st_uid;      //全部者用戶識別號     
                    gid_t      st_gid;      //組識別號   
                    off_t      st_size;      //以字節爲單位的文件容量   
                    time_t     st_atime;   //最後一次訪問該文件的時間   
                    time_t     st_mtime;   //最後一次修改該文件的時間   
                    time_t     st_ctime;//最後一次改變該文件狀態的時間   
                    blksize_t  st_blksize; //包含該文件的磁盤塊的大小   
                    blkcnt_t   st_blocks; //該文件所佔的磁盤塊   
                };
    • filesize.c中顯示的文件時間是直接輸出st_mtime是系統時間,對於用戶來講並不友好,可是能夠調用函數ctime(),將輸出模式改爲用戶友好的年月日(localtime()能夠將其修改爲對應中文格式)
  • ls1.c&ls2.c
    • linux ls命令中還涉及目錄的操做,因此除了stat結構體以外,還須要用到目錄相關的結構體DIR&dirent
    • DIR結構體以下:ios

      struct __dirstream   
        {   
            void *__fd;    
            char *__data;    
            int __entry_data;    
            char *__ptr;    
            int __entry_ptr;    
            size_t __allocation;    
            size_t __size;    
            __libc_lock_define (, __lock)    
        };
    • dirent結構體以下:安全

      struct dirent   
        {   
            long d_ino; /* 索引節點號 */  
            off_t d_off; /* 在目錄文件中的偏移 */  
            unsigned short d_reclen; /*  文件名長 */  
            unsigned char d_type; /*文件類型 */        
            char d_name [NAME_MAX+1]; /*文件名 */  
        }
    • 經過DIR *opendir(const char *filename)dirent *readdir(DIR *dirp)等目錄相關函數取得相應數據輸出便可(opendir()對應記得closedir(),目錄的打開,讀取能夠類比c語言中FILE的打開,讀取,這也從側面體現了在linux系統中一切都是以文件的形式來管理的)函數

  • spwd.c
    • spwd.c要輸出當前的工做路徑,因此在編寫的總體思路上採用一種循環調用的思路:
      • 首先找到本目錄的索引節點,並取得其父目錄索引節點(比較是否相等,判斷是否抵達根目錄)
      • 而後進入父目錄,找到節點對應的文件名,將其存儲起來,準備輸出
      • 循環以上過程,直到到達根目錄,開始輸出路徑名
    • 代碼除了主函數主要功能由其餘三個函數實現:get_inode函數&printpathto函數&inum_to_name函數
    • get_inode()
      • 取某個文件的索引信息(進入點)
    • printpaththo()ui

      void printpathto( ino_t this_inode )
        {
            ino_t   my_inode ;
            char    its_name[BUFSIZ];
      
            if ( get_inode("..") != this_inode )
            {
                chdir( ".." );  /*切換至父目錄*/              
      
                inum_to_name(this_inode,its_name,BUFSIZ);
      
                my_inode = get_inode( "." );        
                printpathto( my_inode );        
                printf("/%s", its_name );       
      
            }
        }
      • 這部分代碼實現了主要的遞歸調用,chdir(..)即切換至其父目錄的函數
    • inum_to_name()
      • 將長整型的索引信息轉化爲字符串的形式
相關文章
相關標籤/搜索