1. 程式人生 > >作業系統實驗:程序的建立

作業系統實驗:程序的建立

實驗名稱:程序的建立實驗

一、實驗目的:

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。