實驗六 程序間通訊(下)

2021-06-21 14:56:16 字數 3271 閱讀 6794

一、實驗名稱:實驗六 程序間通訊(下)

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

三、實驗目的:

l  通過實驗理解共享記憶體通訊

l  通過實驗理解linux訊號量

l  了解linux訊號量與訊息緩衝通訊、記憶體共享通訊之間的差異

l  布置作業1

四、實驗的步驟和方法:

第六次小課程序間通訊(下)

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

l  共享記憶體

l  linux訊號量

(一)       linux共享記憶體通訊

shmget(key,size,flag):建立或獲取共享記憶體id

shmat(int shmid,char*shmaddr,int msg***,ulong *raddr)

shmat(int shmid,int*shmaddr,int msg***,ulong *raddr) :附接到共享記憶體

shmdt(viraddr):切斷與共享記憶體的連線

shmctl(int shmid,intcmd,struct shmid_ds *buf):撤銷共享記憶體

(二)       linux訊號量

主要系統呼叫函式:

建立或獲取訊號量集: int semget(key,nsems,sem***)

對訊號量的p、v操作: intsemop(semid, struct sembuf *sops,nsops)

例項:只有1個元素的pv操作

struct  sembuf p,v;

semop(semid,&p,1);

semop(semid,&v,1);

對訊號量集的控制函式: semctl(semid,semnum,cmd,arg)

有關標頭檔案: linux/sem.h

第二部分程序間通訊實驗

l  共享記憶體

l  訊號量

(一)       利用訊號量實現程序互斥

利用訊號量實現父子程序對臨界資源的互斥訪問。每個程序進入該臨界區3次。

父程序進入臨界區後顯示prnt in,出臨界區則顯示prntout;

子程序進入臨界區後顯示chld in,出臨界區則顯示chldout;

目的:

了解訊號量實現程序互斥的程式設計實現

理解要點:

semget()、semop()、semctl()函式的使用

修改程式,若不使用訊號量,觀察結果與使用訊號量有何區別

利用訊號量實現程序互斥

6-1.c

#include#include#include#include#include//利用訊號量實現程序間互斥

int mutexid;

int main()

//等待子程序終止

wait(0); //等待子程序終止

//撤銷訊號量

semctl(mutexid, ipc_rmid, 0);

exit(0);

} //子程序返回

else

//子程序終止

exit(0);

}}

(二)       利用訊號量實現程序同步

由父程序建立乙個子程序,父子程序共享乙個儲存區,子程序向共享儲存區以覆蓋方式寫資訊,父程序從共享儲存區讀資訊並顯示資訊。父子程序輪流讀寫,即子程序寫乙個資訊到共享記憶體中,父程序從中讀資訊輸出;然後子程序再寫第2個資訊,父程序再讀出第2個資訊輸出,當資訊為end時讀寫程序結束。

父子程序利用訊號量實現對共享記憶體的同步訪問

目的:

了解如何通過訊號量來實現同步

理解要點:

pv操作實現同步的演算法歸納如下:

(1)分析每個程序的執行條件和釋放條件,針對每個執行條件設定乙個訊號量,賦初值。比如子程序執行條件為單緩衝區有空(emptyid,表示緩衝區空,初值為1),父程序執行條件為單緩衝區有值(fullid,表示緩衝區滿,初值為0)

(2)對每個程序做如下處理:

1、請求條件處執行p(子程序寫資料,父程序讀資料,所以需要子程序先寫資料,父程序才能讀,即首先對emptyid進行p操作,減1操作)

2、釋放條件處執行v操作(子程序一旦寫入資料,緩衝區不為空,即應該對fullid(單緩衝區有值)進行v操作,加1操作)

(三)       父子程序利用訊號量實現對共享記憶體的同步訪問

目的:

了解如何通過訊號量來實現同步

分析:

單緩衝區的同步問題

需要2個訊號量,子程序執行條件為單緩衝區有空,父程序執行條件為單緩衝區有數

emptyid,表示緩衝區空,初值為1;

fullid,表示緩衝區滿,初值為0;

涉及共享記憶體的訪問,父程序建立,父子程序共享,父程序撤銷

理解要點:

semget()、semop()、semctl()函式的使用

理解通過訊號量來實現同步與實現互斥的差異

6-2.c

#include#include#include#include#include#include#include//利用訊號量實現程序同步

//定義訊號量內部標識

int emptyid;

int fullid;

main()

printf("child exited\n");

exit(0);

} }//返回父程序,讀資訊並輸出

else

//等待子程序終止

wait(0);

//斷開附接的共享記憶體

shmdt(viraddr);

//撤銷共享記憶體和訊號量集

semctl(emptyid, ipc_rmid, 0);

semctl(fullid, ipc_rmid, 0);

printf("parent exit\n");

exit(0);

} }

程序間通訊《六》

posix 有名訊號燈。posix有名訊號燈 和 基於記憶體的訊號燈乙個很明顯的區別是初始化不一樣 posix 有名訊號燈的初始化如下 sem t sem open const char name,intoflag sem t sem open const char name,intoflag,mo...

(六) 程序間通訊

程序間通訊 ipc 程序間通訊的原因 資料傳輸 資源共享 通知事件 程序控制 程序間通訊方式 1.管道 pipe 和命名管道 fifo 最古老的ipc,但目前很少使用 2.訊號 signal 3.訊息佇列 重點 4.共享記憶體 5.訊號量 6.套接字 socket a.管道通訊 單向的 先進先出的 ...

實驗四 程序間通訊(上)

一 實驗名稱 實驗四 程序間通訊 上 二 實驗日期 2014 3 20 三 實驗目的 1.通過實驗理解軟中斷訊號機制以及如何通過軟中斷實現父子程序同步 2.通過實驗理解無名管道通訊 四 實驗的步驟和方法 第四次小課程序間通訊 上 第一部分本週大課內容回顧 主要內容 1.軟中斷 2.管道通訊 l 程序...