System V 程序間通訊之訊息佇列

2021-08-25 19:36:00 字數 3176 閱讀 8811

訊息佇列的基本模型

訊息佇列中有兩個資料結構

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 兩個程序在使用此共享記憶體空間之前,需要在程序...