編寫程式,演示多程序併發執行和程序軟中斷、管道通訊。
(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//這裡我是迴圈建立了兩個子程序,並且在迴圈體內部需要判斷我的是否是子程序想要再建立子程序(這裡可以嘗試不加if判斷,然後在終端下用ps命令檢視是不是只建立了3個程序)迴圈建立兩個字執行緒
pid_t pid =fork();
if(pid == 0
) //
防止出現子程序再建立出程序
}
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]);//(4)實驗結果從管道讀出資料 關閉寫端
signal(sigint,sig_ign);
signal(
2,func2);
while(1
) close(fd[
0]);
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被編寫成只...