Linux程序間通訊 訊息佇列

2021-10-24 02:16:19 字數 3175 閱讀 6028

1. 訊息佇列概述

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

2. 訊息佇列程式設計

2.1 程式設計說明

訊息佇列的實現包括以下4種操作:

2.2 函式介紹

msgget() 函式

/*****msgget()函式*****/

函式原型:int

msgget

(key_t key,

int msg***)

傳 入 值:key 訊息佇列的鍵值,多個程序可通過它訪問同乙個訊息佇列。ipc_private用於建立私有訊息佇列

msg*** 許可權標誌位

返 回 值:成功:訊息佇列id;

失敗:返回-

1

msgsnd() 函式

/*****msgsnd()函式*****/

函式原型:int

msgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

傳 入 值:msqid 訊息佇列的佇列id

msgp 指向訊息結構的指標

msgsz 訊息正文的位元組數

msg*** 若為0表示呼叫阻塞直到傳送成功為止;ipc_nowait表示若訊息無法立即傳送,函式會立即返回

返 回 值:成功:返回0;失敗:返回-

1//訊息結構msgbuf的定義

struct msgbuf

msgrcv() 函式

/*****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 若在訊息佇列中沒有相應型別的訊息可以接收,則函式立即返回;

-->

0msgsnd

()呼叫阻塞直到接收一條相應型別的訊息位置;

返 回 值:成功:返回0

失敗:返回-

1

msgctl() 函式

/*****msgctl()函式*****/

函式原型:int

msgctl

(int msgid,

int cmd,

struct msqid_ds *buf)

傳 入 值:msqid 訊息佇列的佇列id

cmd --

>ipc_stat 讀取訊息佇列的資料結構msqid_ds,並將其儲存在buf指定的位址中;

-->ipc_set 設定訊息佇列的資料結構msgid_ds中的ipc_perm域值,這個值取自buf引數;

-->ipc_rmid 從系統核心中刪除訊息佇列;

buf 描述訊息佇列的msqid_ds結構型別變數

返 回 值:成功:返回0

失敗:返回-

1

2.3 函式例項

下面的例項體現了如何使用訊息佇列進行兩個程序(傳送端和接收端)之間的通訊。訊息傳送端程序和訊息接收端程序間不需要額外實現程序間的同步。

訊息對傳送端**如下:

/*****msgsnd.c*****/

//省略標頭檔案

#define buffer_size 512

struct message

;int

main()

if((qid =

msgget

(key, ipc_creat|

0666))

==-1)

printf

("open queue %d\n"

,qid)

;while(1

) msg.msg_type =

getpid()

;if((

msgsnd

(qid,

&msg,

strlen

(msg.msg_text),0

))<0)

if((strncmp

(msg.msg_text,

"quit",4

))==0

)break;}

exit(0

);}

訊息佇列接收端的**如下:

/*****msgrcv.c*****/

//省略標頭檔案

#define buffer_size 512

struct message

;int

main()

if((qid =

msgget

(key, ipc_creat|

0666))

==-1)

printf

("open queue %d\n"

,qid);do

printf

("the message from process %d : %s"

,msg.msg_type,msg_msg_text);}

while

(strncmp

(msg.msg_text,

"quit",4

));if

((msgctl

(qid, ipc_rmid,

null))

<0)

exit(0

);}

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