Linux 程序間通訊(七)訊息佇列

2021-08-28 10:28:48 字數 3080 閱讀 7588

顧名思義, 訊息佇列就是一些訊息的列表, 使用者可以在訊息佇列中新增訊息和讀取訊息等。從這點上看, 訊息佇列具有一定的 fifo 特性, 但是它可以實現訊息的隨機查詢, 比 fifo具有更大的優勢。 同時, 這些訊息又是存在於核心中的, 由「佇列 id」 來標識。

訊息佇列的實現包括建立或開啟訊息佇列、 新增訊息、 讀取訊息和控制訊息佇列 4 種操作,

建立或開啟訊息佇列使用的函式是 msgget(), 這裡建立的訊息佇列的數量會受到系統訊息佇列數量的限制;

新增訊息使用的函式是 msgsnd(), 它把訊息新增到已開啟的訊息佇列末尾;

讀取訊息使用的函式是 msgrcv(), 它把訊息從訊息佇列中取走, 與 fifo 不同的是,這裡可以取走指定的某一條訊息;

控制訊息佇列使用的函式是 msgctl(), 它可以完成多項功能。

msgget()函式的語法要點。

函式原型

int msgget(key_t key, int msg***)

函式傳入值

key: 訊息佇列的鍵值, 多個程序可以通過它訪問同乙個訊息佇列, 其中有個特殊值ipc_private, 用於建立當前程序的私有訊息佇列

msg***: 許可權標誌位

函式返回值

成功: 訊息佇列 id

出錯: 1

msgsnd()函式的語法要點。

函式原型

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

函式傳入值

msqid: 訊息佇列的佇列 id

msgp: 指向訊息結構的指標, 該訊息結構 msgbuf 通常如下。

msgsz: 訊息正文的位元組數(不包括訊息型別指標變數)

msg***:

ipc_nowait: 若訊息無法立即傳送(如當前訊息佇列已滿) , 函式會立即返回

0: msgsnd 呼叫阻塞直到傳送成功為止

函式返回值

成功: 0

出錯: 1

msgrcv()函式的語法要點。

函式原型

int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msg***)

函式傳入值

msqid: 訊息佇列的佇列 id

msgp: 訊息緩衝區, 同 msgsnd()函式的 msgp

msgsz: 訊息正文的位元組數(不包括訊息型別指標變數)

msgtyp:

0: 接收訊息佇列中第乙個訊息

大於 0: 接收訊息佇列中第乙個型別為 msgtyp 的訊息續表

小於 0: 接收訊息佇列中第乙個型別值不小於 msgtyp 絕對值且型別值最小的訊息

msg***:

msg_noerror:若返回的訊息比 msgsz 位元組多,則訊息就會截短到 msgsz位元組, 且不通知訊息傳送程序

ipc_nowait: 若在訊息佇列中並沒有相應型別的訊息可以接收, 則函式立即返回

0: msgsnd()呼叫阻塞直到接收一條相應型別的訊息為止

函式返回值

成功: 0

出錯: 1

struct msqid_ds ;

//the ipc_perm structure is defined as follows (the highlighted fields are settable using ipc_set):

struct ipc_perm ;

例項**:

接收方

#include #include #include #include #include #include struct msg_st; 

int main()

while(running)

printf("you wrote: %s\n",data.text);

if(0 == strncmp(data.text, "end", 3))

running = 0; }

//remove message queue

if(-1 == msgctl(msgid, ipc_rmid, 0))

exit(exit_success);

}

傳送方

#include #include #include #include #include #include #define max_text 512

struct msg_st;

int main()

while(running)

if(strncmp(buffer, "end", 3) == 0)

running = 0;

usleep(100000);

} exit(exit_success);

}

執行結果:

$ ./recv &

[1] 16437

$ ./send

enter data : 123

you wrote: 123

enter data : 456

you wrote: 456

enter data : 789

you wrote: 789

enter data : end

you wrote: end

[1]+ done ./recv

Linux程序間通訊 訊息佇列

linux和類linux系統下程序間通訊 inter process communication,ipc 有很多種方式,包括套接字 socket 共享記憶體 shared memory 管道 pipe 訊息佇列 message queue 等,各自有各自的一些應用場景和用途,這次就來聊一聊訊息佇列這...

linux程序間通訊 訊息佇列

訊息佇列由id 唯一標識 訊息佇列就是乙個訊息的列表,使用者可在佇列中新增,讀取訊息等 可按照型別來收發訊息 int msgget key t key,int flag int msgsnd int msqid,const void msgp,size t size,int flag msqid 訊...

Linux程序間通訊 訊息佇列

首先上篇文章我們說到了linux下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...