編寫一段程式,使用系統呼叫fork()建立兩個子程序。當此程式執行時,在系統中有乙個父程序和兩個子程序活動。讓每乙個程序輸出不同的內容。試觀察記錄螢幕上的顯示結果,並分析原因。
fork()返回值意義:
返回值<0,建立失敗
返回值=0,在子程序中
返回值》0,在父程序中
vim fork1.c
進入編輯
結果如上圖
分析:在呼叫fork()函式建立子程序後,父子程序的執行順序由作業系統來決定。從程序併發執行來看,各種情況都有可能,這三個程序的輸出順序具有隨機性。
修改上述程式,每乙個程序迴圈顯示一句話。子程序顯示「duaghter…」及「son…」,父程序顯示「parent…」,觀察結果,分析原因。
再次進入fork1.c編輯
結果如上圖
每個程序迴圈10次
分析:由於函式printf( )在輸出字串時不會被中斷,所以,字串內部字元順序輸出不變。由於程序併發執行的排程順序和父子程序搶占處理機問題,迴圈輸出字串的順序隨著程序執行的不同而發生變化。
在呼叫exec()函式用新的程式替換該子程序的內容,並利用wait()函式來控制程序執行的順序。呼叫exit()函式使子程序結束。
用fork函式建立子程序後,子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。因為呼叫exec並不建立新程序,所以前後的程序id並未改變。exec只是用乙個全新的程式替換了當前程序的正文、資料、堆和棧段。
有6種不同的exec函式可供使用,它們常常被統稱為exec函式。這些exec函式使得unix程序控制原語更加完善。用fork可以建立新程序,用exec可以執行新程式。exit函式和兩個wait函式處理終止和等待終止。
系統呼叫exec()和fork()聯合使用能為程式開發提供有力支援。用fork( )建立子程序,然後在子程序中使用exec(),這樣就實現了父程序與乙個與它完全不同子程序的併發執行。
等待子程序執行結束。如果子程序沒有完成,父程序一直等待。wait()將呼叫程序掛起,直至其子程序因暫停或終止而發來軟體中斷訊號為止。如果在wait()前已有子程序暫停或終止,則呼叫程序做適當處理後便返回。
對於wait()
首先查詢呼叫程序是否有子程序,若無,則返回出錯碼;
若找到一處於「僵死狀態」的子程序,則將子程序的執行時間加到父程序的執行時間上,並釋放子程序的程序表項;
若未找到處於「僵死狀態」的子程序,則呼叫程序便在可被中斷的優先順序上睡眠,等待其子程序發來軟中斷訊號時被喚醒。
該函式表示退出,傳入的引數是程式退出時的狀態,0表示正常退出,其他表示非正常他退出
結果如上圖
分析:我們在使用了exec()函式後程式使用了ls的命令,列出/bin/目錄下的檔案資訊,我們可以發現在使用wait()函式後,父程序永遠將在其他的子程序完成之後才執行,程式在呼叫fork()函式建立乙個子程序後,馬上呼叫wait()函式,使父程序在子程序結束之前一直處於睡眠狀態,所以在輸出的結果中我們可以看到最後輸出的將是父程序的資訊。
我的很多操作都是根據這些題目在網上找部落格看得,感覺對於程序的一些排程以及很多與程序有關的函式都不怎麼懂,通過這次作業,我對於這些知識有了一點了解,但是有些知識還是處於略迷糊的狀態,下次再加油弄懂。。。
實驗3程序同步
實驗3程序同步 一 實驗目的 1.掌握訊號通訊機制,實現程序之間通過訊號進行通訊 2.掌握共享記憶體 訊號量通訊實現方法。二 實驗工具與裝置 裝有linux系統的計算機。三 實驗內容 1.使用 fork 建立程序,實現兩個程序之間的通訊,乙個程序把乙個變數的值加 5,另乙個程序輸出該變數的值。inc...
linux 守護程序詳解及建立守護程序
linux 守護程序詳解及建立守護程序 守護程序是一種後台執行並且獨立於所有終端控制之外的程序。守護程序的啟動 要啟動乙個守護程序,可以採取一下幾種方式 守護程序的建立 先來看乙個守護程序建立的例子 include include include include define maxfd 64 vo...
Linux程序同步
linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...