作業系統實驗:程序的建立
實驗名稱:程序的建立實驗
一、實驗目的:
1. 加深對程序概念的理解,明確程序和程式的區別。進一步認識併發執行的實質。
2. 認識程序生成的過程,學會使用fork生成子程序,並知道如何使子程序完成與父程序不同的工作。
二、實驗要求:
1. 將下面的程式編譯執行,並解釋現象。
#include < sys/types.h >
#include < stdio.h >
#include < unistd.h >
int main(){
int pid1=fork();
printf(“**1**\n”);
int pid2=fork();
printf(“**2**\n”);
if(pid1==0){intpid3=fork();printf(“**3**\n”);}
else printf(“**4**\n”);
return 0;
}
2. 通過實驗完成第三章習題3.4。
3. 編寫一段程式,使用系統呼叫fork()建立兩個子程序。當此程式執行時,在系統中有一個父程序和兩個子程序活動。讓每一個程序在螢幕上顯示一個字元;父程序顯示字元“a”;子程序分別顯示字元“b”和字元“c”。試觀察記錄螢幕上的顯示結果,並分析原因。
三、實驗過程:
1. 將題目1中的程式碼寫進test.c檔案中並編譯執行,得到如圖所示的結果。
分析如下:
主程式中產生兩個子程序,記為程序1和程序2。pid1的值和pid2的值均不為0。由於主程序中pid1值不為0,所以沒有產生第三個程序。因此主程序輸出1、2、4。
程序1中,由於pid1值為0,所以又產生了兩個子程序,記為程序3和程序4,pid2為子程序返回值,不為0。因此程序1輸出1、2、3。
程序2中,由於pid1不為0,因此沒有產生子程序,輸出2、4。
程序3中,pid1值為0,因此產生了一個子程序,記為程序5,輸出2、3。
程序4中,接著intpid3=fork();的下一句執行,輸出了3。
程序5中,同樣輸出了一個3。
由於程式執行時,各個程序的順序並不是按照分析那樣依次執行,因此輸出的順序有所不同。按照此結果,程序執行順序是主程序、程序2、程序1、程序3、程序2、程序5。
(另外值得注意的是,我的Linux在執行此程式時,每次出來的結果都不一樣,我認為是在執行多個程序時,哪個程序先執行是系統隨機選擇的)
2. 將題目2中的程式碼寫進test3.c檔案中並編譯執行,得到如圖所示的結果。
PARENT:value= 5.
當控制回到父程序時,它的值會保持在5,而子程序將更新並拷貝這個值。
3. test2.c程式碼如圖
如圖,pid1=0時表示正在執行第一個子程序,pid2為0時表示正在執行第二個子程序。
分析如下
主程序產生兩個子程序,而第一個子程序中又產生了同第二個子程序相同的一個子程序,因此主程序(pid1不為0, pid2不為0)輸出a,第一個子程序(pid1=0, pid2不為0)輸出b,第二個子程序(pid1不為0,pid2=0)輸出c,第一個子程序的子程序(pid1= pid2=0)輸出b、c。