實驗四 程序間通訊(上)

2021-06-21 14:56:16 字數 4233 閱讀 9748

一、實驗名稱:實驗四 程序間通訊(上)

二、實驗日期:2014/3/20

三、實驗目的:

1.   通過實驗理解軟中斷訊號機制以及如何通過軟中斷實現父子程序同步

2.   通過實驗理解無名管道通訊

四、實驗的步驟和方法:

第四次小課程序間通訊(上)

第一部分本週大課內容回顧

主要內容

1.  軟中斷

2.  管道通訊

l  程序間通訊根據資訊量不同能劃分成哪兩種型別?兩種型別有何區別?

程序控制(控制資訊的通訊,低階通訊)

資料交換(大批資料的通訊,高階通訊)

l  os為程序間通訊提供的常用介面有哪些?linux支援哪些機制?

介面:

軟中斷訊號、訊號量集

管道、訊息佇列、共享記憶體等

linux支援的有:

軟中斷訊號、管道、ipc(訊號量、訊息緩衝、共享記憶體)

軟中斷訊號的預置函式signal()

呼叫格式:signal(sig,function)

說明:

sig 軟中斷訊號的序號或名稱

function 與軟中斷訊號關聯的函式名

l  軟中斷訊號主要用於解決何種問題?

l  如何使用軟中斷訊號?

l  管道的定義?無名管道的工作原理是?

l  無名管道能否進行雙向通訊?無名管道能否在任意程序間通訊?

linux軟中斷訊號的系統呼叫(1)

軟中斷訊號的預置函式signal()

呼叫格式:signal(sig,function)

說明:

sig 軟中斷訊號的序號或名稱

function 與軟中斷訊號關聯的函式名

linux軟中斷訊號的系統呼叫(2)

傳送軟中斷訊號函式kill()

呼叫格式:kill(pid,sig)

說明:

pid表示乙個或一組程序標示符,pid值的定義如下:

>0:將訊號傳送給指定的程序

=0:將訊號傳送給同組的所有程序

=-1:將訊號傳送給所有滿足如下條件的程序:程序的使用者標示符等於傳送訊號程序的有效使用者標示符

sig為軟中斷訊號(序號或名稱)

linux管道通訊(1)

無名管道的建立

系統呼叫:int pipe(int pipename[2]);

引數說明:

pipename[2],管道名,為一2元整型陣列

pipename[0]專用於讀程序

pipename[1]專用於寫程序

返回值:整型。0代表管道建立正確;-1代表管道建立失敗。

該管道由建立程序及其子孫程序共享

使用標頭檔案:unistd.h

linux管道通訊(2)

無名管道的讀寫系統呼叫

寫:write(pipename[1],buf,size);

讀:read( pipename[0],buf,size);

引數說明:

pipename,管道名。其中[0]專用於管道的讀操作,[1]專用於管道的寫操作

buf,存放讀或者寫資料的緩衝區

size,讀或者寫資料的長度(位元組數)

第二部分程序間通訊實驗

1.  軟中斷

2.  管道通訊

實驗1 軟中斷實驗

4-1.c:編寫乙個程式,迴圈顯示字串」hello!」,當鍵盤鍵入ctrl+c時終止迴圈,並顯示「ok!」後結束。

實驗1 軟中斷實驗(4-1.c)

分析:

結果如圖所示:

l改造:要求按3次ctrl + c後才結束

將signal()語句和函式刪除後重新編譯看結果有何變化?

實驗2 使用軟中斷實現父子程序同步

父程序建立子程序p1,父程序顯示3行字串;

父程序向子程序傳送軟中斷訊號,等待子程序終止後,父程序輸出結束資訊」ok!」,然後終止執行。

子程序迴圈顯示」i am a child!」,接收到父程序發來的軟訊號後停止迴圈,顯示」child exited!」並終止執行。

實驗2 軟中斷實驗(4-2.c)

分析:

父子父同步

結果如圖所示:

l改造:如果把kill()函式注釋掉,結果將如何?為什麼?

實驗3 無名管道應用

檔名4-3.c:父程序建立乙個子程序和乙個無名管道fd,由子程序向管道寫入資訊」thisis a message!」,然後終止執行;父程序接收到子程序終止訊號後從管道中讀出並顯示資訊後結束。

注意:管道的建立、管道資料的讀寫

實驗3 無名管道應用 (4-3.c)

分析:

結果如圖所示:

l改造:父程序建立兩個子程序p1、p2,p1向管道的寫資料「pipemessage test」,p2從管道讀資料並顯示這些資料。

l思考:類似這種父子程序之間的資料通訊還有什麼解決方案?

python 程序間通訊 上

一 使用queue來實現程序間的記憶體共享 coding utf 8 from multiprocessing import process,queue import os,time def f q,n q.put n,hello if name main 此queue不是直接匯入的import q...

程序間通訊(上)基礎函式篇

printf d d n fds 0 fds 1 3和4,相當於用兩種方式開啟了1個檔案 pid t id fork 建立子程序 if id 0 close fds 1 關閉pipe檔案 exit 0 else if id 0 else waitpid id,null,0 等待子程序退出 int m...

Linux 下程序間的通訊(上)

1.傳統的nuix通訊方式 無名管道,有名管道以及訊號 2.ipc程序間的通訊方式 訊息佇列,共享記憶體及訊號燈集 注 全部的通訊方式都是在核心中完成 以下是各種通訊方式的詳細介紹 list item管道通訊 管道不屬於任何檔案系統,且只存在與記憶體中,但對於管道的讀寫也可以使用普通的read wr...