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

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

教材學習內容總結

  • ECF是操做系統用來實現I/O、進程和虛擬內存的基本機制。
  • 應用程序經過使用一個叫作陷阱或者系統調用的ECF形式,向操做系統請求服務。好比,向磁盤寫數據、從網絡讀取數據、建立一個新進程,以及終止當前進程,都是經過應用程序調用來實現的。理解基本的系統調用機制將幫助理解這些服務是如何提供給應用程序的。
  • 操做系統爲應用程序提供了強度大的ECF機制,用來建立新進程、等待進程終止、通知其餘進程系統中的異常事件,以及檢測和響應這些事件。
  • 異常是異常控制流的一種形式,它一部分由硬件實現,一部分有操做系統實現。
  • 系統中可能的每種類型的一場都分配了一個惟一的非負整數的一場號,其中一些號碼有處理器的設計者分配,其餘號碼是由操做系統內核的設計者分配。
  • 一場能夠分爲四類:中斷、陷阱、故障和終止
類型 緣由 異步/同步 返回行爲
中斷 來自I/O設備的信號 異步 老是返回到下一條指令
陷阱 有意的異常 同步 老是返回到下一條指令
故障 潛在可恢復的錯誤 同步 可能返回到當前指令
終止 不可恢復的錯誤 同步 不會返回
  • 邏輯控制流,在系統中一般有許多其餘程序在運行,進程也能夠向每一個程序提供一種假象,好像他在都在獨佔的使用處理器。若是想用調試器單步執行程序,咱們會看到一系列的程序計數器(PC)的值,這些值惟一地對應於包含在程序的可執行目標文件中的指令,或是包含在運行時動態鏈接到程序的共享對象中的指令。這個PC值的序列叫作邏輯控制流,或者簡稱邏輯流。
  • 併發流,一個邏輯流的執行在時間上與另外一個流重疊,成爲併發流,這兩個流被稱爲併發的運行。
  • 系統調用錯誤處理,當Unix系統級函數遇到錯誤時,他們一般會返回-1,並設置全局整數變量errno來表示什麼出錯了。
  • 獲取進程ID,每一個進程都有一個惟一的正數進程ID(PID)。getpid函數返回調用進程的PID。
  • 每個Linux文件都有一個類型來代表他在系統中的角色html

    1.普通文件包含任意數據。應用程序經常要區分文本文件和二進制文件,文本文件是隻含有ASCII或Unicode字符的普通文件;二進制文件是全部其餘的文件。對內核而言,文本文件和二進制文件沒有區別。
    Linux文本文件包含了一個文本行序列,其中每一行都是一個字符序列,以一個新行符「\n」結束。新行符與ASCII的換行符(LF)是同樣的,其數字值爲0x0a。
    2.目錄是包含一組連接的文件,其中每一個連接都將一個文件名映射到一個文件,這個文件多是另外一個目錄。每一個目錄至少含有兩個條目:「.」是到該目錄自身的連接,以及「..」是到目錄層次結構中父目錄的連接。你能夠用mkdir命令建立一個目錄,用ls查看其內容,用rmdir刪除該目錄。
    3.套接字是用來與另外一個進程進行跨網絡通訊的文件
  • 打開和關閉文件,進程是經過調用open函數來打開一個已存在的文件或者建立一個新的我文件.
  • 關於fork()函數的做用
    例如:

    爲何兩行都打印出來了?在我想來,無論pid是多少,都應該只有一行纔對。
    緣由在於fork以後,操做系統會複製一個與父進程徹底相同的子進程,雖然說是父子關係,可是在操做系統看來,他們更像兄弟關係。
    這2個進程共享代碼空間,可是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也徹底相同,但只有一點不一樣,若是fork成功,子進程中fork的返回值是0,父進程中fork的返回值是子進程的進程號,若是fork不成功,父進程會返回錯誤。能夠這樣想象,2個進程一直同時運行,並且步調一致,在fork以後,他們分別做不一樣的工做,也就是分岔了。這也是fork爲何叫fork的緣由。
  • 關於exec()函數
    fork函數是用於建立一個子進程,該子進程幾乎是父進程的副本,而有時咱們但願子進程去執行另外的程序,exec函數族就提供了一個在進程中啓動另外一個程序執行的方法。它能夠根據指定的文件名或目錄名找到可執行文件,並用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完以後,原調用進程的內容除了進程號外,其餘所有被新程序的內容替換了。另外,這裏的可執行文件既能夠是二進制文件,也能夠是Linux下任何可執行腳本文件。
    在Linux中並無exec函數,而是有6個以exec開頭的函數族,下表列舉了exec函數族的6個成員函數的語法。node

所需頭文件 #include <unistd.h>
函數說明 執行文件
函數原型 int execl(const char path, const char arg, ...)
函數原型 int execv(const char path, char const argv[])
函數原型 int execle(const char path, const char arg, ..., char *const envp[])
函數原型 int execve(const char path, char const argv[], char *const envp[])
函數原型 int execlp(const char file, const char arg, ...)
函數原型 int execvp(const char file, char const argv[])
函數返回值 成功:函數不會返回
函數返回值 出錯:返回-1,失敗緣由記錄在error中

要記住這六個函數之間的區別,就要搞清楚 「l」 、「v」、「p」、「e」表明的含義git

「l」表示參數以列表的形式表示;
「v」表示參數以數組的形式表示;
「p」表示在PATH中搜索執行文件;
「e」表示可附加環境參數。
 execlp、execvp這兩個函數第一個形參是名爲file表示能夠只列出文件名就能夠了,不用指出它的路徑。
  • wait函數說,當一個進程正常或異常終止時,內核就向其父進程發送SIGCHLD信號。由於子進程終止是個異步事件,這種信號也是內核向父進程發的異步通知。父進程能夠忽略該信號,或者提供一個該信號發生時即被調用執行的函數(信號處理程序)。
    父進程同步等待子進程退出時則調用wait函數,此時父進程可能會有以下三種情形:

阻塞(若是其全部子進程都還在運行)。數組

帶回子進程的終止狀態當即返回(若是已有一個子進程終止,正等待父進程取其終止狀態)安全

出錯當即返回(若是它沒有任何子進程)。網絡

  • wait函數
所需頭文件 #include <sys/types.h> #include <sys/wait.h>
函數說明 wait()會暫時中止目前進程的執行,直到有信號來到或子進程結束。若是在調用wait()時子進程已經結束,則wait()會當即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一塊兒返回。若是不在乎結束狀態值,則status能夠設成NULL
函數原型 pid_t wait (int *status)
函數傳入值 這裏的status 是一個整型指針,是該子進程退出時的狀態:1.status 若爲空,則表明不記錄子進程結束狀態。2.status 若不爲空,則由status記錄子進程的結束狀態值。
函數返回值 成功返回子進程識別碼(PID)
函數返回值 出錯-1,失敗緣由存於errno中
  • waitpid函數
所需頭文件 #include <sys/types.h> #include <sys/wait.h>
函數說明 waitpid()會暫時中止目前進程的執行,直到有信號來到或子進程結束。若是在調用waitpid()子進程已經結束,則waitpid()會當即返回子進程結束狀態值。子進程的結束狀態值會由參數status返回,而子進程的進程識別碼也會一塊兒返回。若是不在乎結束狀態值,則參數status能夠設成NULL。參數pid爲欲等待的子進程識別碼
函數原型 pid_t waitpid(pid_t pid,int * status,int options)
函數傳入值 pid<-1:等待進程組識別碼爲pid絕對值的任何子進程
函數傳入值 pid=-1: 等待任何子進程,至關於wait()
row 1 col 1 pid=0:等待進程組識別碼與目前進程相同的任何子進程
row 2 col 1 pid=>0:等待任何子進程識別碼爲pid的子進程
函數傳入值 參數options能夠爲0 或下面的OR 組合
函數傳入值 參數options,WNOHANG:若是沒有任何已經結束的子進程則立刻返回,不予以等待。此時返回值爲0
函數傳入值 參數options,WUNTRACED:若是子進程進入暫停執行狀況則立刻返回,但結束狀態不予以理會
函數傳出值 同wait函數
函數返回值 成功返回子進程識別碼(PID)
函數返回值 成功使用選項WNOHANG且沒有子進程退出返回0
函數返回值 出錯-1,失敗緣由存於errno中
  • exit函數,
    exit() 結束當前進程/當前程序/,在整個程序中,只要調用 exit ,就結束return()是當前函數返回,固然若是是在主函數main,天然也就結束當前進程了,若是不是,那就是退回上一層調用。在多個進程時.若是有時要檢測上進程是否正常退出的就要用到上個進程的返回值..數據結構

    exit(1)表示進程正常退出. 返回 1;
     
      exit(0)表示進程非正常退出. 返回 0.
      
      進程環境與進程控制(1): 進程的開始與終止
      
    函數原型:int main(int argc, char *argv[]);
  • open函數
int open(char* filename,int flags,mode_t mode)

opne函數將filename轉換爲一個文件描述符,而且返回描述符數字。返回的描述符老是在進程中當前沒有打開的最小描述符。flags參數指明瞭進程打算如何訪問這個文件:
1.O_RDONLY:只讀.
2.O_WRONLY:只寫
3.O_RDWR:可讀可寫
4.O_CREAT:若是文件不存在,就建立他的一個截斷的空文件
5.O_TRUNC:若是文件已經存在,就截斷它。
6.O_APPEND:在每次寫操做前,設置文件位置到文件的結尾處。併發

  • 進程經過調用close函數關閉一個打開的文件,若成功則返回0,若出錯則爲返回-1
  • 應用程序是經過分別調用read和write函數來執行輸入輸出的:
ssize_t read(int fd,void *buf,size_t n);
ssize_t write(int fd,const void *buf,size_t n);

關於read函數異步

返回值:成功則返回讀的字節數,EOF返回0,出錯返回-1。函數

fd:文件描述符

buf:存儲器位置

n:最多從當前文件位置拷貝n個字節到存儲器位置buf
關於write函數

返回值:成功則返回寫的字節數,出錯返回-1。

fd:文件描述符

buf:存儲器位置

n:最多從存儲器位置buf拷貝n個字節到當前文件位置

  • 共享文件,內核用三個相關的數據結構來表示打開的文件:

    1.描述符表:每一個進程都有獨立的描述符表,由進程打開的文件描述符來索引,每一個打開的描述符表項指向文件表中的一個表項。

    2.文件表:全部進程共享,表項組成包括當前文件位置、引用計數、一個指向v-node表中對應表項的指針。引用計數爲0時,內核會刪除這個文件表表項。

    3.v-node表:全部進程共享,每一個表項包含stat結構中的大多數信息。

    教材學習中的問題和解決過程

    書p603rio_read函數中,erro!=EINTR我感受應該是erro==EINTR

代碼調試中的問題和解決過程

代碼託管

image

上週考試錯題總結

  • 錯題1及緣由,理解狀況
  • 錯題2及緣由,理解狀況
  • ...

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 其餘

本週結對學習狀況

[20155317](http://www.cnblogs.com/wxwddp/p/7671075.html)
![image](http://note.youdao.com/favicon.ico)
- 結對學習內容
    - XXXX
    - XXXX
    - ...

其餘(感悟、思考等,可選)

xxx
xxx

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 200/200 2/2 20/20
第二週 300/500 2/4 18/38
第三週 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

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

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

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進狀況:

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

參考資料

相關文章
相關標籤/搜索