天天看點

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

本周學習内容

一、指令學習

fork()

首先我們使用

man fork

指令來看一下fork指令的基本内容。fork指令的作用是生成一個子程序。

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

一個程序,包括代碼、資料和配置設定給程序的資源。fork()函數通過系統調用建立一個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個程序也可以做不同的事。

一個程序調用fork()函數後,系統先給新的程序配置設定資源,例如存儲資料和代碼的空間。然後把原來的程序的所有值都複制到新的新程序中,隻有少數值與原來的程序的值不同。相當于克隆了一個自己。

為了了解fork指令的意思我從網上找了一個例子:

#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   
    pid_t fpid; //fpid表示fork函數傳回的值  
    int count=0;  
    fpid=fork();   
    if (fpid < 0)   
        printf("error in fork!");   
    else if (fpid == 0) {  
        printf("i am the child process, my process id is %d/n",getpid());   
        printf("我是爹的兒子/n");//對某些人來說中文看着更直白。  
        count++;  
    }  
    else {  
        printf("i am the parent process, my process id is %d/n",getpid());   
        printf("我是孩子他爹/n");  
        count++;  
    }  
    printf("統計結果是: %d/n",count);  
    return 0;  
}  
           

而當我們運作這個程式的時候我們會得到結果:

i am the child process, my process id is 2912
我是爹的兒子
統計結果是: 1
i am the parent process, my process id is 2913
我是孩子他爹
統計結果是: 1
           
2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

一個fork傳回了兩個不同的fpid值分别是2912與2913!

在語句fpid=fork()之前,隻有一個程序在執行這段代碼,但在這條語句之後,就變成兩個程序在執行了,這兩個程序的幾乎完全相同,将要執行的下一條語句都是if(fpid<0)……

為什麼兩個程序的fpid不同呢,這與fork函數的特性有關。fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠傳回兩次,它可能有三種不同的傳回值:

  • 在父程序中,fork傳回新建立子程序的程序ID;
  • 在子程序中,fork傳回0;
  • 如果出現錯誤,fork傳回一個負值;

在fork函數執行完畢後,如果建立新程序成功,則出現兩個程序,一個是子程序,一個是父程序。在子程序中,fork函數傳回0,在父程序中,fork傳回新建立子程序的程序ID。我們可以通過fork傳回的值來判斷目前程序是子程序還是父程序。

exec

首先也使用

man exec

來檢視exec的相關内容。

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

exec指令用于調用并執行指令的指令。exec指令通常用在shell腳本程式中,可以調用其他的指令。如果在目前終端中使用指令,則當指定的指令執行完畢後會立即退出終端。

wait

使用

man wait

檢視wait的内容。

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

系統中的僵屍程序都要由wait系統調用來回收。

僵屍程序介紹:

系統調用exit後,該程序并非馬上消失,而是留下一個叫僵屍程序的資料結構,僵屍程序是非常特使的一種,它放棄了幾乎所有的記憶體空間,沒有任何可執行代碼,也不能别排程,僅僅在程序清單保留位置,而且不占用任何記憶體空間。

waitpid

2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

man waitpid

檢視waitpid的内容。

waitpid()會暫時停止目前程序的執行,直到有信号來到或子程序結束。

本周學習問題總結

問題1:wait和waitpid有什麼差別?

解決方案1:

  1. wait()函數用于使父程序(也就是調用wait()的程序)阻塞,直到一個子程序結束或者該程序接收到了一個指定的信号為止。如果該父程序沒有子程序或者它的子程序已經結束,則wait()函數就會立即傳回。
  2. waitpid()的作用和wait()一樣,但它并不一定要等待第一個終止的子程序(它可以指定需要等待終止的子程序),它還有若幹選項,如可提供一個非阻塞版本的 wait()功能,也能支援作業控制。實際上,wait()函數隻是 waitpid()函數的一個特例,在Linux 内部實作 wait()函數時直接調用的就是waitpid()函數。
2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結

學習進度條

代碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目标 5000行 20篇 400小時
第一周 100/100 1/1 5/5
第二周 100/200 2/3 5/10
第三周 100/300 2/5 5/15
第四周 100/400 1/6 5/20
第五周 100/500 1/7 5/25

代碼托管

參考資料

linux c學習筆記----程序建立(fork,wait,waitpid)

linux wait與waitpid函數的深入分析