程序的控制 實驗2

2021-04-26 13:51:27 字數 2486 閱讀 2594

二  程序的控制

實驗目的

1、掌握程序另外的建立方法

2、熟悉程序的睡眠、同步、撤消等程序控制方法

實驗內容

1、用fork( )建立乙個程序,再呼叫exec( )用新的程式替換該子程序的內容

2、利用wait( )來控制程序執行順序

實驗指導

一、所涉及的系統呼叫

在unix/linux中fork( )是乙個非常有用的系統呼叫,但在unix/linux中建立程序除了fork( )之外,也可用與fork( ) 配合使用的exec( )。

1、exec(  )系列

系統呼叫exec( )系列,也可用於新程式的執行。fork( )只是將父程序的使用者級上下文拷貝到新程序中,而exec( )系列可以將乙個可執行的二進位制檔案覆蓋在新程序的使用者級上下文的儲存空間上,以更改新程序的使用者級上下文。exec( )系列中的系統呼叫都完成相同的功能,它們把乙個新程式裝入記憶體,來改變呼叫程序的執行**,從而形成新程序。如果exec( )呼叫成功,呼叫程序將被覆蓋,然後從新程式的入口開始執行,這樣就產生了乙個新程序,新程序的程序識別符號id 與呼叫程序相同。

exec( )沒有建立乙個與呼叫程序併發的子程序,而是用新程序取代了原來程序。所以exec( )呼叫成功後,沒有任何資料返回,這與fork( )不同。exec( )系列系統呼叫在unix系統庫unistd.h中,共有execl、execlp、execle、execv、execvp五個,其基本功能相同,只是以不同的方式來給出引數。

一種是直接給出引數的指標,如:

int  execl(path,arg0[,arg1,...argn],0);

char  *path,*arg0,*arg1,...,*argn;

另一種是給出指向參數列的指標,如:

int execv(path,argv);

char *path,*argv[ ];

具體使用可參考有關書。

2、exec( )和fork( )聯合使用

系統呼叫exec和fork( )聯合使用能為程式開發提供有力支援。用fork( )建立子程序,然後在子程序中使用exec( ),這樣就實現了父程序與乙個與它完全不同子程序的併發執行。

一般,wait、exec聯合使用的模型為:

int status;

............

if (fork( )= =0)

wait(&status);

3、wait( )

等待子程序執行結束。如果子程序沒有完成,父程序一直等待。wait( )將呼叫程序掛起,直至其子程序因暫停或終止而發來軟中斷訊號為止。如果在wait( )前已有子程序暫停或終止,則呼叫程序做適當處理後便返回。

系統呼叫格式:

int  wait(status) 

int  *status;

其中,status是使用者空間的位址。它的低8位反應子程序狀態,為0表示子程序正常結束,非0則表示出現了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統給出。

核心對wait( )作以下處理:

(1)首先查詢呼叫程序是否有子程序,若無,則返回出錯碼;

(2)若找到一處於「僵死狀態」的子程序,則將子程序的執行時間加到父程序的執行時間上,並釋放子程序的程序表項;

(3)若未找到處於「僵死狀態」的子程序,則呼叫程序便在可被中斷的優先順序上睡眠,等待其子程序發來軟中斷訊號時被喚醒。

4、exit( )

終止程序的執行。

系統呼叫格式:

void exit(status)

int status;

其中,status是返回給父程序的乙個整數,以備查考。

為了及時**程序所占用的資源並減少父程序的干預,unix/linux利用exit( )來實現程序的自我終止,通常父程序在建立子程序時,應在程序的末尾安排一條exit( ),使子程序自我終止。exit(0)表示程序正常終止,exit(1)表示程序執行有錯,異常終止。

如果呼叫程序在執行exit( )時,其父程序正在等待它的終止,則父程序可立即得到其返回的整數。核心須為exit( )完成以下操作:

(1)關閉軟中斷

(2)**資源

(3)寫記帳資訊

(4)置程序為「僵死狀態」

二、參考程式

#include

#include

main( )

}三、執行結果

執行命令ls  -l  -color ,(按倒序)列出當前目錄下所有檔案和子目錄;

ls completed!

四、分析原因

程式在呼叫fork( )建立乙個子程序後,馬上呼叫wait( ),使父程序在子程序結束之前,一直處於睡眠狀態。子程序用exec( )裝入命令ls ,exec( )後,子程序的**被ls的**取代,這時子程序的pc指向ls的第1條語句,開始執行ls的命令**。

注意在這裡wait( )給我們提供了一種實現程序同步的簡單方法。

五、思考

(1)可執行檔案載入時進行了哪些處理?

(2)什麼是程序同步?wait( )是如何實現程序同步的?

程序的控制 實驗2

二 程序的控制 實驗目的 1 掌握程序另外的建立方法 2 熟悉程序的睡眠 同步 撤消等程序控制方法 實驗內容 1 用fork 建立乙個程序,再呼叫exec 用新的程式替換該子程序的內容 2 利用wait 來控制程序執行順序 實驗指導 一 所涉及的系統呼叫 在unix linux中fork 是乙個非常...

實驗1 程序控制

編寫程式,演示多程序併發執行和程序軟中斷 管道通訊。1 父程序使用系統呼叫pipe 建立乙個管道,然後使用系統呼叫fork 建立兩個子程序,子程序1和子程序2 2 子程序1每隔1秒通過管道向子程序2傳送資料 i send you x times.x初值為1,每次傳送後做加一操作 3 子程序2從管道讀...

程序控制(2)

在程序控制 1 中,介紹了建立子程序fork和vfork函式,其實在建立乙個程序之後,子程序往往會呼叫乙個exec函式去執行另乙個程式。當呼叫乙個exec函式之後,該程序執行的程式完全替換為新程式,而新程式從main函式開始執行。exec函式並不建立新的程序,前後程序id不變,只是用磁碟上的乙個新程...