共享記憶體
共享共存區域是被多個程序共享的一部分物理記憶體。如果多個程序都
把該記憶體區域對映到自己的虛擬位址空間,則這些程序就都可以直接
訪問該共享記憶體區域,從而可以通過該區域進行通訊。共享記憶體是進
程間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了數
據,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。
共享記憶體實現分為兩個步聚:
一、建立共享記憶體,使用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 管道通訊方式的中間介質是檔案,通常稱這種檔案為管道檔案。兩個程序利用管道檔案進行通訊時,乙個程序為寫程序,另乙個程序為讀程序。寫程序通過寫端 傳送端 往管道檔案中寫入資訊 讀程序通過讀端 接收端 從管道檔案中讀取資訊。兩個程序協調不斷地進行寫 讀,便會構成雙方通過管道傳遞資訊的流...