2017-2018-1 20155313 《資訊安全系統設計基礎》第六周學習總結
本周學習内容
一、指令學習
fork()
首先我們使用
man fork
指令來看一下fork指令的基本内容。fork指令的作用是生成一個子程序。

一個程序,包括代碼、資料和配置設定給程序的資源。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
一個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的相關内容。
exec指令用于調用并執行指令的指令。exec指令通常用在shell腳本程式中,可以調用其他的指令。如果在目前終端中使用指令,則當指定的指令執行完畢後會立即退出終端。
wait
使用
man wait
檢視wait的内容。
系統中的僵屍程序都要由wait系統調用來回收。
僵屍程序介紹:
系統調用exit後,該程序并非馬上消失,而是留下一個叫僵屍程序的資料結構,僵屍程序是非常特使的一種,它放棄了幾乎所有的記憶體空間,沒有任何可執行代碼,也不能别排程,僅僅在程序清單保留位置,而且不占用任何記憶體空間。
waitpid
man waitpid
檢視waitpid的内容。
waitpid()會暫時停止目前程序的執行,直到有信号來到或子程序結束。
本周學習問題總結
問題1:wait和waitpid有什麼差別?
解決方案1:
- wait()函數用于使父程序(也就是調用wait()的程序)阻塞,直到一個子程序結束或者該程序接收到了一個指定的信号為止。如果該父程序沒有子程序或者它的子程序已經結束,則wait()函數就會立即傳回。
- waitpid()的作用和wait()一樣,但它并不一定要等待第一個終止的子程序(它可以指定需要等待終止的子程序),它還有若幹選項,如可提供一個非阻塞版本的 wait()功能,也能支援作業控制。實際上,wait()函數隻是 waitpid()函數的一個特例,在Linux 内部實作 wait()函數時直接調用的就是waitpid()函數。
學習進度條
代碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 |
---|---|---|---|
目标 | 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函數的深入分析