Linux 記憶體共享與訊息佇列

2021-04-26 07:59:56 字數 3548 閱讀 7896

共享記憶體

共享共存區域是被多個程序共享的一部分物理記憶體。如果多個程序都

把該記憶體區域對映到自己的虛擬位址空間,則這些程序就都可以直接

訪問該共享記憶體區域,從而可以通過該區域進行通訊。共享記憶體是進

程間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了數

據,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。

共享記憶體實現分為兩個步聚:

一、建立共享記憶體,使用shmget函式。

二、對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去

,使用shmat函式。

系統呼叫:shmget()

原型:int shmget(key_t key,int size,int shm***);

返回值:如果成功,返回共享記憶體段識別符號。如果失敗,則返回-1;

errno=einval(無效的記憶體段大小)

eexist(記憶體段已經存在,無法建立)

eidrm(記憶體段已經被刪除)

enoent(記憶體段不存在)

eacces(許可權不夠)

enomem(沒有足夠的記憶體來建立記憶體段)

系統呼叫:shmat();

原型:int shmat(int shmid,char *shmaddr, int shm***);

返回值:如果成功,則返回共享記憶體段連線到程序中的位址。如果失

敗,則返回-1;

errno=einval(無效的ipc id值或者無效的位址)

enomem(沒有足夠的記憶體)

eacces(訪問許可權不夠)

當乙個程序不在需要共享的記憶體段時,它將會把記憶體段從其位址空間

中脫離。

系統呼叫:shmdt();

呼叫原型:int shmdt(char* shmaddr);

返回值:如果失敗,則返回-1;

errno=einval(無效的連線位址)

共享記憶體例項見:shmadd.c

#include

#include

#include

#include

#include

#define bufsz 2048

int main()

else

printf("created shared-memory:%d/n",shmid);

system("ipcs -m");

if((shmadd=shmat(shmid,0,0))<(char*)0)

else

printf("attached shared-memory/n");

system("ipcs -m");

if((shmdt(shmadd))<0)

else

printf("deleted shared-memory/n");

system("ipcs -m");

exit(0);}

訊息佇列

訊息佇列就是訊息的乙個鍊錶,它允許乙個或多個程序向它寫訊息,

乙個或多個程序從中讀訊息。具有一定的fifo的特性,但是可實現消

息的隨即查詢。這些訊息存在於核心中,則「佇列id」來標識。訊息佇列的實現包括建立和開啟佇列、新增訊息、讀取訊息和控制消

息佇列這四種操作。

msgget:建立和開啟佇列,其訊息數量受系統限制。

msgsnd:新增訊息,將訊息新增到訊息佇列發部。

msgrcv:讀取訊息,從訊息佇列中取走訊息。

msgctl:控制訊息佇列。

nt msgget(key_t key,int flag)

key:返回新的或已有佇列的id,ipc_private

int msgsnd(int msqid,struct msgbuf *msgp,size_t msgsz,int

flag)

其中:msqid是訊息佇列的佇列id;

msgp是訊息內容所在的緩衝區;

msgsz是訊息的大小;

msgflag是標誌,ipc_nowait若訊息並沒有立即傳送而呼叫程序會立即

返回。

struct msgbuf;

int msgrcv(int msqid,struct msgbuf * msgp,size_t mesgsz,long

msgtyp,int flag)

msqid是訊息佇列的引用識別符號;

msgp是接收到的訊息將要存放的緩衝區;

msgsz是訊息的大小;

msgtyp是期望接收的訊息型別;

msgflag是標誌。

int msgctl(int msqid,int cmd,struct msqid_ds*buf)

msqid是訊息佇列的引用識別符號;

cmd是執行命令;

buf是乙個緩衝區。

cmd引數指定對於由msqid規定的佇列要執行的命令:

ipc_stat取此佇列的msqid_ds結構,並將其存放在buf指向的結構中。

ipc_set按由buf指向的結構中的值,設定與此佇列相關的結構中的下

列四個字段:

msg_perm.uid、msg_perm.gid、msg_perm.mode和msg_qbytes。此命令

只能由下列兩種程序執行:一種是其有效使用者id特於msg_perm.cuid或

msg_perm.uid;另一種是具有超級使用者特權的程序。只有超級使用者才

能增加msg_qbytes的值。

ipc_rmid從系統中刪除該訊息佇列以及仍在該佇列上的所有資料。這

種刪除立即生效。仍在使用這一訊息佇列的其他程序在它們下一次試

圖對此佇列進行操作進,將出錯返回eidrm。

此命令只能由下列兩種程序執行:一種是其有效使用者id等於

msg_perm.cuid或msg_perm.uid;另一種是具有超級使用者特權的程序。

訊息佇列例項見msg.c

#include

#include

#include

#include

#include

#include

#include

#define bufsz 512

struct message;

int main()/*ftok函式學習一下搞明白*/

if((qid=msgget(key,ipc_creat|0666))==-1)

printf("opend queue%d/n",qid);

puts("please enter the message to queue:");

if((fgets(msg.msg_text,bufsz,stdin))==null)

msg.msg_type=getpid();

len=strlen(msg.msg_text);

if((msgsnd(qid,&msg,len,0))<0)

if(msgrcv(qid,&msg,bufsz,0,0)<0)

printf("message is%s/n",msg.msg_text);

if((msgctl(qid,ipc_rmid,null))<0)

exit(0);

}

linux 訊息佇列 和 共享記憶體

1.基本知識 存在於核心中2.基本流程及函式 傳送 接收 1 申請key值 2 建立 開啟 訊息佇列 3 傳送訊息 建立結構體 typedef struct msg t 1 key t key ftok 5 if key 0 2 int msgid msgget key,ipc creat 0777...

Linux共享記憶體 訊息佇列通訊詳解

在linux核心中建立一段共享記憶體,使用shmget函式 include include int shmget key t key,size t size,int shm 第乙個引數key定義是否建立乙個帶金鑰的共享記憶體。include include include include inclu...

管道 訊息佇列 共享記憶體

管道通訊 pipe 管道通訊方式的中間介質是檔案,通常稱這種檔案為管道檔案。兩個程序利用管道檔案進行通訊時,乙個程序為寫程序,另乙個程序為讀程序。寫程序通過寫端 傳送端 往管道檔案中寫入資訊 讀程序通過讀端 接收端 從管道檔案中讀取資訊。兩個程序協調不斷地進行寫 讀,便會構成雙方通過管道傳遞資訊的流...