Linux Linux程序間通訊之訊息佇列

2021-08-29 16:23:45 字數 3465 閱讀 7798

1、訊息佇列概念引入

訊息佇列提供了乙個從乙個程序向另外乙個程序傳送一塊資料的方法每個資料塊都被認為是有乙個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(msgmax),每個訊息佇列的總的位元組數是有上限的(msgmnb),系統上訊息佇列的總數也有乙個上限(msgmni)

2、程序間通訊資料結構

核心為每個程序間通訊物件維護了乙個資料結構

struct ipc_perm ;

訊息佇列在核心中的表示:

struct msqid_ds ;

3、訊息佇列相關的函式

(1)msgget函式

函式原型:

#include

#include

#include

int msgget(key_t key, int msgflag);

功能:建立和訪問乙個訊息佇列。

引數:引數一表示某個訊息佇列的名字

引數二表示許可權設定為,一共有九個選項可供選擇。

返回值:

成功返回乙個非負整數,即訊息佇列的標號,失敗返回-1

(2)msgctl函式

函式原型:

#include

#include

#include

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

功能·:

訊息佇列的控制函式

引數:引數一表示訊息佇列標識碼

引數二表示將要採取的動作可以有三個選擇,

ipc_stat   ipc_set   ipc_rmid  ipc_info

引數三是乙個結構體,

struct msqid_ds {

struct ipc_perm msg_perm;     /* ownership and permissions */

time_t          msg_stime;    /* time of last msgsnd(2) */

time_t          msg_rtime;    /* time of last msgrcv(2) */

time_t          msg_ctime;    /* time of last change */

unsigned long   __msg_cbytes; /* current number of bytes in

queue (non-standard) */

msgqnum_t       msg_qnum;     /* current number of messages

in queue */

msglen_t        msg_qbytes;   /* maximum number of bytes

allowed in queue */

pid_t           msg_lspid;    /* pid of last msgsnd(2) */

pid_t           msg_lrpid;    /* pid of last msgrcv(2) */

返回值:

成功返回0,失敗返回-1

(3)msgsnd函式

函式原型:

#include

#include

#include

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

功能:把一條訊息加到訊息佇列中

引數解釋:

引數一:有msgget函式返回的訊息佇列標識碼。

引數二:指標指向要傳送的訊息

引數三:訊息長度

引數四:控制佇列滿時要發生的事情,msg*** = ipc_nowait,當佇列滿時不等待,返回eagain錯誤

返回值:

成功返回0,失敗返回-1

說明:1.訊息結構在兩方面受到制約:

首先,它必須小於系統規定的上限值;

其次,它必須以乙個long int長整數開始,接收者函式將利用這個長整數確定訊息的型別

2.訊息結構參考形式如下:

struct msgbuf {

long  mtype;

char mtext[1];

(4)msgrcv函式

函式原型:

#include

#include

#include

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,  int msg***);

功能·:

從乙個訊息佇列接收訊息

引數解釋:

引數一:由magget函式返回的訊息佇列的標號

引數二:指標,指向準備接收的訊息

引數三:訊息的長度

引數四:可以實現接收優先順序的簡單形式,

引數五:控制著佇列中沒有相應型別的訊息可供做的事情

返回值:

成功返回實際放入緩衝區的字元個數,失敗返回-1

說明:msgtype=0返回佇列第一條資訊

msgtype>0返回佇列第一條型別等於msgtype的訊息 

msgtype<0返回佇列第一條型別小於等於msgtype絕對值的訊息,並且是滿足條件的訊息型別最小的訊息

msg***=ipc_nowait,佇列沒有可讀訊息不等待,返回enomsg錯誤。

msg***=msg_noerror,訊息大小超過msgsz時被截斷

msgtype>0且msg***=msg_except,接收型別不等於msgtype的第一條訊息。

實現**:

執行結果:

這樣就可以實現程序間不斷的對話一樣的資料交流。

使用ipcs  -q命令可以看當前的所有訊息佇列,使用ipcrm -q msqid

刪除訊息佇列

Linux linux程序間通訊

程序間通訊是指在不同程序之間傳播或交換資訊 程序間通訊可分為以下幾類 管道 匿名管道和命名管道 system ipc 訊息佇列 用於資料傳輸 共享記憶體 用於資料共享 訊號量 用於事件通知 posix ipc 訊息佇列 共享記憶體 互斥量條件變數 訊號量讀寫鎖 主要介紹常用的如管道 訊息佇列 訊號量...

Linux Linux程序間通訊之共享記憶體

1 共享記憶體概念引入 共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料 2 共享記憶體資料結構 struct shmid ds struct ipc perm shm per...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...