訊息佇列的基本模型
訊息佇列中有兩個資料結構
60
#define msg_mem_scale 32
6162
#define msgmni
16/* <= ipcmni */
/* max # of msg queue identifiers */
63#define msgmax
8192
/* <= int_max */
/* max size of message (bytes) */
64#define msgmnb
16384
/* <= int_max */
/* default max size of a message queue */
在centos 6.5中規定:
linux訊息佇列管理
1.在使用乙個訊息佇列之前,需要用msgget函式來建立乙個訊息佇列,函式如下:
int msgget(key_t key, int msg***);
引數分析
key:
系統為每個ipc機制都分配了唯一的id,可以自己定義,或者由ftok函式來獲取,
只要任意程序用到相同的id,即可實現程序間通訊。
msg***:
其中可以選擇:ipc_creat:如果key不存在,就建立乙個key,若key存在則返回id
ipc_excl:如果key存在,返回失敗
ipc_nowait:如果需要等待,直接返回錯誤
低位用來確定訪問許可權,最終值為perm&umask,與|選項一起使用
返回值:
返回乙個msqid,即為key的控制代碼
2.訊息佇列屬性控制用msgctl函式來實現
int
msgctl(int msqid, int cmd, struct msqid_ds *buf);
引數分析
msqid:key的操作控制代碼,一般為msgget的返回值
cmd:執行的控制命令,包括選項有:
ipc_stat:讀取訊息佇列屬性,並將msqid__ds結構體資訊放入buf中
ipc_set:讀取訊息佇列屬性,按buf中的值設定訊息佇列中去設定所屬使用者,所屬組,許可權等資訊
ipc_rmid:刪除訊息佇列
ipc_info:讀取訊息佇列的
buf:
msqid_id結構體型別變數,用於儲存資訊或者修改訊息佇列資訊
返回值:
大多數成功返回0,失敗返回-1
3.傳送訊息到訊息佇列msgsnd函式
int msgsnd(int msqid, const
void *msgp, size_t msgsz, int msg***);
引數分析:
msqid:
訊息佇列的控制代碼,即要傳送到的訊息佇列
msgp:
指向使用者定義的緩衝區,是乙個需要在使用時自己定義的資料結構
struct msgbuf;
msgsz:
發出資訊的大小。
msg***:
用來指定在達到系統為訊息佇列規定的邊界時所採取的操作
1.ipc_nowait:如果需要等待,則不傳送訊息直接返回,錯誤資訊:eagain
2.如果設定為0,則阻塞呼叫程序
4.從訊息佇列接受資訊msgrcv
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msg***);
引數分析:
msqlid:
函式從訊息佇列msqid中接收資訊。
msgp:
從訊息佇列接收的資訊放入msgp當中
msgsz:
用於指定mtext的大小,收到的訊息大於msgsz並且msg***&msg_noerrer為真,則
擷取部分將丟失。
msgtyp用於指定接收到的訊息的型別,具體如下:
1.等於0:接收佇列中第一條訊息,任意型別
2.大於0:接收佇列中第一條為這個型別的訊息
3.小於0:接收第一條最低訊息
ms***:
為設定選項
訊息佇列的應用例項
用訊息佇列來實現乙個聊天程式
3
#include
4#include
5#include
6#include
7#include
8#include
9#include
1011
struct msgbuf;
1516
int main(int argc, char* argv)
17 27else
if(pid == 0)//子程序傳送訊息
28
40 }
41else
42 ;
47while(1)
53 }
5455
return
0; 56 }
3
#include
4#include
5#include
6#include
7#include
8#include
9#include
1011
struct msgbuf;
1516
int main(int argc, char* argv)
17 27else
if(pid == 0)//子程序傳送訊息
28
40 }
41else
42 ;
47while(1)
53 }
5455
return
0; 56 }
這樣就實現了聊天接收傳送,不再是單向傳輸了。 system V 程序間通訊 訊息佇列
程序間通訊,顧名思義就是程序和程序通訊,也就是程序a和程序b可以訪問核心的同一塊空間乙個放資料,乙個取資料,那麼這兩個程序就完成通訊通訊了。訊息佇列也有管道一樣的不足 1.每個訊息的最大長度是有上限的msgmax位元組,每個訊息佇列的總位元組數是有上限的msgmnb,系統中訊息佇列的總數是有上限的m...
System V版本IPC程序間通訊主題之共享記憶體
一.什麼是共享記憶體 共享記憶體 使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說就是,程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料 它的工作原理可以用...
System V程序間通訊 共享記憶體
一 共享記憶體ipc原理 共享記憶體程序間通訊機制主要用於實現程序間大量資料的傳輸,共享記憶體是在記憶體中單獨開闢的一段記憶體空間,這段記憶體空間有自己特有的資料結構,包括訪問許可權 大小和最近訪問時間。資料結構定義如下 struct shmid ds 兩個程序在使用此共享記憶體空間之前,需要在程序...