實驗五 程序間通訊(中)

2021-06-21 14:56:16 字數 4014 閱讀 3231

一、實驗名稱:

實驗五程序間通訊(中)

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

三、實驗目的:

1.  通過實驗理解訊息緩衝通訊

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

3.  了解訊息緩衝通訊與記憶體共享通訊之間的差異

四、實驗的步驟和方法:

第五次小課程序間通訊(中)

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

llinux的ipc機制

linux的ipc的含義是?ipc物件有哪幾種?

1.  ipc—inter processcommunication,程序間通訊。

2.  linux的ipc機制包含如下ipc物件:訊息佇列、共享記憶體、訊號量集(未講)

3.  ipc物件

ø  每個ipc物件擁有唯一的ipc標識(ipc_ids和ipc_id)

ø  每個ipc物件都有乙個公共的ipc_perm結構,其中擁有乙個唯一的key

ø  理解ipc識別符號與key的差異

ø  理解ipc_perm結構中mode的定義

ø  ipc_perm在linux中為kern_ipc_perm結構

訊息佇列是臨界資源嗎?對同乙個訊息佇列進行訪問的多個傳送和接收程序存在何種制約關係?

訊息佇列通訊的缺點是?

由shmget獲得的共享記憶體區域是屬於何種型別?(選項有物理記憶體頁面 or磁碟檔案)

共享記憶體通訊相對訊息佇列通訊的優點是?仍存在的問題?

llinux訊息緩衝通訊

1.建立或獲取訊息佇列標識:

int msgget(key_t key,int msgflag)

2.傳送訊息到指定佇列:

int msgsnd(int msgid,struct msgbuf* msgp,intsize,int flag)

3.從指定佇列中接收訊息:

int msgrcv(int msgid,struct msgbuf* msgp,int size,int type, int flag)

type=0接收佇列的第乙個訊息;>0接收型別type的第乙個訊息;<0接收小於或等於| type |的最低型別的第乙個訊息。

4.訊息佇列狀態查詢、修改或撤銷佇列:

int msgctl(int msgid, int cmd, struct msgid_ds*buf)

llinux共享記憶體通訊

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,int cmd,struct shmid_ds *buf):共享記憶體的狀態查詢、修改或撤銷

第二部分程序間通訊實驗

1.  訊息緩衝通訊

2.  共享記憶體通訊

程序間通訊實驗(1)

l訊息緩衝通訊實驗

利用訊息緩衝通訊方式,實現訊息的傳送與接收。

1.  傳送程序sndfile.c將要傳送的訊息從鍵盤輸入,每輸入一行就作為一條訊息傳送,用end作為結束訊息

2.  接收程序rcvfile.c從訊息佇列逐個接收資訊並顯示,用 end作為結束訊息

3.  設訊息佇列的key值為1234

目的:了解緩衝訊息通訊的程式設計實現

理解要點:

1.  my_msg結構就是msgbuf結構,需自定義

2.  msgget()、msgsnd()、msgrcv()函式的使用

3.  採用各種方式或順序執行此二程序,觀察結果

解題思路:

2個程式:sndfile.c和rcvfile.c

1. sndfile.c

定義訊息緩衝區資料結構(my_msg);

通過msgget()建立訊息佇列;

while(1)

2. rcvfile.c

定義訊息緩衝區資料結構(my_msg);

通過msgget()獲取訊息佇列;

while(1)

rcvfile.c

#include#include#include#include#include#include#define maxmsg 512

struct my_msg //定義訊息緩衝區資料結構

msg;

main()

msgctl(msgid, ipc_rmid, 0); //刪除訊息佇列

exit(0);

}

rcvfile.c

#include#include#include#include#include#include#define maxmsg 512

struct my_msg //定義訊息緩衝區資料結構

msg;

main()

msgctl(msgid, ipc_rmid, 0); //刪除訊息佇列

exit(0);

}

改造:

1.  嘗試使用傳送與接收中的key值不一樣或者設為0,看看是怎樣的結果。

程序間通訊實驗(2)

l 共享記憶體通訊實驗(sndshm.c和rcvshm.c)

利用共享記憶體的方式,實現前一實驗的基本目標

目的:了解共享記憶體通訊

理解要點:

shmget()、shmat()、shmdt()、shmctl()的使用

理解訊息緩衝通訊與共享記憶體通訊之間的差異

解題思路:

2個程式:sndshm.c和rcvshm.c

sndshm.c

通過shmget()建立共享記憶體;

while(1)

sndshm.c

#include#include#include#include#include#includemain()

shmdt(viraddr); //切斷與共享記憶體的鏈結

exit(0);

}

rcvshm.c

通過shmget()建立共享記憶體;

顯示訊息;

通過shmdt()斷開附接;

通過shmctl()撤銷共享記憶體;

rcvshm.c

#include#include#include#include#include#includemain()

Linux程序間通訊(五)

共享記憶體 使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。示例 comm.h 1 pragma once 2 3 include4 include5 include6 7 defi...

實驗四 程序間通訊(上)

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

實驗六 程序間通訊(下)

一 實驗名稱 實驗六 程序間通訊 下 二 實驗日期 2014 4 3 三 實驗目的 l 通過實驗理解共享記憶體通訊 l 通過實驗理解linux訊號量 l 了解linux訊號量與訊息緩衝通訊 記憶體共享通訊之間的差異 l 布置作業1 四 實驗的步驟和方法 第六次小課程序間通訊 下 第一部分本週大課內容...