實驗1 程序控制

2021-09-08 07:59:17 字數 2145 閱讀 8212

編寫程式,演示多程序併發執行和程序軟中斷、管道通訊。

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

(2)  子程序1每隔1秒通過管道向子程序2傳送資料: i send you x times. (x初值為1,每次傳送後做加一操作)

(3)  子程序2從管道讀出資訊,並顯示在螢幕上;

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

child process l is killed by parent!

child process 2 is killed by parent!

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

parent process is killed!

(1)思路:

按照實驗內容,我們需要用父程序建立兩個子程序,從而實現子程序之間通過管道(除此之外,還有mmap,fifo通訊方式)來實現程序間通訊。所以我們需要首先建立出兩個子程序(這裡注意fork函式使用的時候,避免子程序再建立出新的子子程序的問題,這樣可能會導致整個程式退出的時候出現孤兒程序)。具體的程序通訊步驟會在下面說明,還有就是linux下訊號的使用,父程序接受到來自鍵盤的中斷訊號(我們可以在終端輸入kill -l來檢視不同的型別)的時候,父程序捕獲訊號,然後想子程序發出kill訊號。

(2)實現**:

int fd[2];//

fd[0] 讀端 fd[1] 寫端

int ret = pipe(fd);

這裡是首先建立兩個檔案描述符,乙個是讀端(建立出的子程序中的乙個來操作讀端),乙個是寫端(另乙個子程序操作寫端);然後建立乙個管道,引數就是我們剛剛建立的檔案描述符。

for(; i//

迴圈建立兩個字執行緒

pid_t pid =fork();

if(pid == 0

) //

防止出現子程序再建立出程序

}

這裡我是迴圈建立了兩個子程序,並且在迴圈體內部需要判斷我的是否是子程序想要再建立子程序(這裡可以嘗試不加if判斷,然後在終端下用ps命令檢視是不是只建立了3個程序)

signal(sigint,func0);
這裡我們在父程序中新增捕獲ctrl+c訊號的signal函式,捕獲到之後執行func0函式,想子程序傳送kill訊號

下面是父子程序具體需要執行的內容:

父程序:

close(fd[0]);//

父程序需要關閉pipe的讀端和寫端

close(fd[1

]); pid_t wpid;

//阻塞等待子程序執行完畢**子程序資源

while( (wpid = waitpid(-1, null, wnohang)) != -1

) }

寫端子程序:

int x = 1

; signal(sigint,sig_ign);

signal(

2,func1);

while (1

)

close(fd[

1]);

讀端子程序:

close(fd[1]);//

從管道讀出資料 關閉寫端

signal(sigint,sig_ign);

signal(

2,func2);

while(1

) close(fd[

0]);

(4)實驗結果

posted @

2018-12-05 10:59

風沙迷了眼 閱讀(

...)

編輯收藏

Linux下程序控制實驗

1 fork 建立子程序 include include include include include include include 程序建立 void main void else if child 0 子程序 while child wait status 1 errno eintr 子程序...

程序及程序控制

學習程序之前,先了解一下程式 所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu 記憶體.而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。linux下的...

Unix 程序控制

一 程序 程序id為1是init程序,在自舉過程結束時由核心呼叫。程序id為2是頁精靈程序,此程序負責支援虛存系統的請頁操作。也是核心程序。二 fork 對於父程序已經終止的所有程序,它們的父程序都改變為init程序,我們稱這些程序由init程序領養。此保證了每個程序有乙個父程序。init被編寫成只...