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

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

系統級I/O

輸入/輸出(I/O)是在記憶體和外部裝置之間複製資料的過程。輸入操作是從I/O裝置複製資料到主存,而輸出操作是從主存複製資料到I/O裝置。

Unix I/O

一個Unix檔案就是一個m個位元組的序列:B0,B1,B(\k),B(\m-1),所有的I/O裝置,如網路、磁碟和終端,都被模型化為檔案,而所有的輸入和輸出都被當做對相應的檔案的讀和寫來執行。這種將裝置優雅的對映為檔案的方式,允許Unix核心引出一個簡單的、低階的應用介面,稱為Unix I/O

  • 開啟檔案。一個應用程式通過要求核心開啟相應的檔案,來宣告它想要訪問一個I/O裝置。核心返回一個小的非負整數,叫做描述符,它在後續對此檔案的所有操作中標示這個檔案。
  • Linux shell建立的每個程序開始時都有三個開啟的檔案:標準輸入(描述符為0)、標準輸出(描述符為1)和標準錯誤(描述符為2)。標頭檔案<unistd.h>定義了常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,可用來代替顯式的描述符值
  • 改變當前檔案的檔案位置。對於每個開啟的檔案,核心保持著一個檔案位置k,初始為0.這個檔案位置是從檔案開頭起始的位元組偏移量。
  • 讀寫檔案:一個讀操作就是從檔案拷貝n>0個位元組到儲存器。寫操作就是從儲存器拷貝n>0個位元組到一個檔案。
  • 關閉檔案:當應用完成了對檔案的訪問之後,它就通知核心關閉這個檔案。作為響應,核心釋放檔案開啟時建立的資料結構,並將這個描述符恢復到可用的描述符池中。無論一個程序因為何種原因終止時,核心都會關閉所有開啟的檔案並釋放它們的儲存器資源。

    檔案


    開啟或關閉檔案

    程序是通過呼叫open函式來開啟一個已存在的檔案或者建立一個新檔案的

    open函式將filename轉換為一個檔案描述符,並且返回描述符數字。返回的描述符總是在晉城中當前沒有開啟的最小描述符。flags引數指明瞭程序打算如何訪問這個檔案:

O_RDONLY:只讀
O_WRONLY:只寫
O_RDWR:可讀可寫

fd = open("foo.txt",O_RDONLY,0);
1
flags引數也可以是一個或者更多位掩碼的或,為寫提供給一些額外的指示:

O_CREAT:如果檔案不存在,就建立它的一個截斷的(空)檔案
O_TRUNC:如果檔案已經存在,就截斷它
O_APPEND:在每次寫操作前,設定檔案位置到檔案的結尾處

fd = open("foo.txt",O_ WRONLY | O_APPEND,0)
開啟一個已存在的檔案,並在後面新增一些資料
1
2
mode引數指定了新檔案的訪問許可權位,當程序通過帶某個mode引數的open函式呼叫來建立一個檔案時,檔案的訪問許可權位被設定為mode &(~umask) 。給定下面的mode和umask預設值

#define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
#define DEF_UMASK S_IWGRP|S_IWOTH

1
2
建立一個新檔案,檔案的擁有者有讀寫許可權,而所有其他的使用者都有讀許可權

umask(DEF_UMASK);
fd = open("foo.txt",O_CREAT|O_TRUNC|O_WRONLY);
1
2
最後,程序通過呼叫close函式關閉一個開啟的檔案

#include <unistd.h>
int close(int fd);

讀和寫檔案

應用程式是通過分別呼叫read和write函式來執行輸入和輸出的

I/O重定向

LInux shell提供了I/O重定向操作符,允許使用者將磁碟檔案和標準輸入輸出聯絡起來
unix > ls > foo.txt
I/O重定向一種方式是使用dup2函式。

#include <unistd.h>
int dup2(int oldfd,int new fd);
返回:若成功則為非負的描述符,若出錯則為-1

課上知識點

man -k key1 | grep key2| grep 2 : 根據關鍵字檢索系統呼叫
grep -nr XXX /usr/include :查詢巨集定義,型別定義
od命令 $ od -tc -tx1 abc.txt
echo -ne "/x7b" > abc.bin 建立二進位制檔案