作業系統課程設計四 程序管理

2021-10-04 00:17:45 字數 2726 閱讀 4379

父程序使用系統呼叫pipe()建立乙個管道,然後使用系統呼叫fork()建立兩個子程序:子程序1和子程序2。

子程序1每隔1秒通過管道向子程序2傳送資料:i send message x times.(x初值為1,以後傳送一次後做加一操作)子程序2從管道讀出資訊,並顯示在螢幕上。

父程序用系統呼叫signal()來捕捉來自鍵盤的中斷訊號sigint(即按ctrl+c鍵,);當捕捉到中斷訊號後,父程序用系統呼叫kill()向兩個子程序發出訊號,子程序捕捉到訊號後分別輸出如下資訊後終止:

child process 1 is killed by parent! 

child process 2 is killed by parent!

父程序等待兩個子程序終止後,釋放管道並輸出如下的資訊後終止

parent process is killed!
程式功能:

父程序建立兩個子程序:子程序1和子程序2

子程序1每隔1秒通過管道向子程序2傳送資料:i send message x times.子程序2從管道讀出資訊,並顯示在螢幕上

子程序捕捉到訊號後分別輸出如下資訊後終止: child process 1 is killed by parent! child process 2 is killed by parent!父程序等待兩個子程序終止後,釋放管道並輸出如下的資訊後終止: parent process is killed!

設計思路:

首先定義兩個陣列,用來訊息傳送。

通過系統呼叫pipe()實現管道,管道是半雙工的,資料只能向乙個方向流動(用lockf 或關閉檔案);需要雙向通訊時,需要建立起兩個管道;資料的讀出和寫入:乙個程序向管道中寫的內容被管道另一端的程序讀出。寫入的內容每次都新增在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出資料。管道通過系統呼叫 pipe()來實現,函式的功能和實現過程如下。原型:int pipe( int fd[2] )返回值:如果系統呼叫成功,返回 0。如果系統呼叫失敗返回-1: errno = emfile (沒有空閒的檔案描述符)。fd[0] 用於讀取管道,fd[1] 用於寫入管道。

利用fork()建立兩個程序,如果 fork()呼叫成功,它向父程序返回子程序的 pid,並向子程序返回 0,即 fork() 被呼叫了一次,但返回了兩次。建立程序之後,對於子程序1,關閉讀(fd[0]),使用write實現訊息傳遞。對子程序2,關閉寫(fd[1]),使用read讀到訊息,列印到螢幕。

每乙個程序都在各自的while(1)迴圈中,當訊號發出,執行相應程式**,退出當前程序。

加入錯誤處理機制,每次fork()都判斷返回值是否非為-1。同時根據返回值是否大於0,來判斷是父程序還是子程序。

exec()系列系統呼叫 exec()系列,也可用於新程式的執行。fork()只是將父程序的使用者級上下文拷貝到新程序中,而 exec()系列可以將乙個可執行的二進位制檔案覆蓋在新程序的使用者級上下文的儲存空間上,以更改新程序的使用者級上下文。exec()系列中的系統呼叫都完成相同的功能,它們把乙個新程式裝入記憶體,來改變呼叫程序的執行**,從而形成新程序。如果exec()呼叫成功後,沒有任何資料返回,這與 fork()不同。exec()系列呼叫在 linux 系統庫 unistd.h 中,共有 execl、execlp、execv、execvp 五個,其基本功能相同,只是以不同的方式來給出引數。

exit()終止程序的執行。系統呼叫格式:void exit(status) 其中,status 是返回給父程序的乙個整數,以備查考。為了及時**程序所占用的資源並減少父程序的干預,linux/linux 利用 exit()來實現程序的自我終止,通常父程序在建立子程序時,應在程序的末尾安排一條 exit(),使子程序自我終止。exit(0)表示程序正常終止,exit(1)表示程序執行有錯,異常終止。如果呼叫程序在執行 exit()時,其父程序正在等待它的終止,則父程序可立即得到其返回的整數。

signal()會依引數signum 指定的訊號編號來設定該訊號的處理函式。當指定的訊號到達時就會跳轉到引數handler指定的函式執行。當乙個訊號的訊號處理函式執行時,如果程序又接收到了該訊號,該訊號會自動被儲存而不會中斷訊號處理函式的執行,直到訊號處理函式執行完畢再重新呼叫相應的處理函式。但是如果在訊號處理函式執行時程序收到了其它型別的訊號,該函式的執行就會被中斷。

#include#include#include#include#include#include#includepid_t pid1, pid2;//程序型別定義

int fd[2];

int cnt=0;

void handler(int signo)

if(pid1==0&&signo==sigusr1)

if(pid2==0&&signo==sigusr2)

}int main()

signal(sigint,handler);//當接收到乙個型別為sig的訊號時,就執行handler 所指定的函式

pid1=fork();

if(pid1==0)

}else if(pid1>0)

}//等兩個子程序結束

waitpid(pid2, null, 0);

waitpid(pid1, null, 0);

close(fd[0]);

close(fd[1]);

printf("parent process is killed!\n");

}else

return 0;

}

作業系統課程設計

實驗 一 程序管理與程序同步 實驗目的 了解程序管理的實現方法,理解和掌握處理程序同步問題的方法並完成程式設計。實驗內容 實現銀行家演算法 程序排程的過程模擬。實驗步驟 理解銀行家演算法的核心機制 設計相應資料結構 程式設計實現 測試。理解程序的三狀態排程過程 設計排程演算法 程式設計實現 測試。實...

作業系統課程設計

1 實驗內容 學習程序管理的設計與實現,學習和運用作業系統原理,設計乙個作業系統子系統的模擬系統。通過該系統的設計除錯可增加對作業系統實現的感知性。設計乙個允許n個程序併發執行的程序管理的模擬系統。該系統包括簡單的程序控制 同步及通訊機構,其程序排程演算法可任意選擇。分析系統所需的資料結構 演算法的...

作業系統課程設計 模擬作業系統

程序管理主要包括程序排程,程序的建立和撤銷 程序的阻塞和喚醒,中斷作用的實現。用全域性變數模擬重要暫存器,如cpu重要暫存器,程式狀態暫存器psw 指令暫存器ir,程式計數器pc,資料緩衝暫存器dr等。中斷的發現應該是硬體的工作,這裡在函式cpu中加檢測psw的方式來模擬。在cpu 函式中,每執行一...