8 程序間通訊 訊息佇列

2021-07-11 21:38:45 字數 1934 閱讀 4958

使用訊息佇列實現程序間的通訊

首先將傳送的資料打包成訊息的型別,使用乙個程序負責將訊息傳送到訊息佇列中,另外乙個程序負責從訊息佇列中接收資訊,從而實現程序間通訊

1 使用訊息佇列通訊的基本流程

(1)獲取key值,使用ftok函式

ftok函式

#include

#include

key_t  ftok(const char *pathname,int proj_id);

第乙個引數:字串形式的路徑名(必須存在,可以訪問)

第二個引數:專案id,取低8位(必須是非0)

返回值:成功返回生成的key值,失敗返回-1

函式功能:

主要用於根據引數指定的路徑和專案id,生成乙個key值

注意:如果使用相同的路徑名和專案id,則生成相同的key值

(2)建立/獲取訊息佇列,使用msgget函式

msgget函式

#include

#include

#include

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

第乙個引數:key值,ftok函式的返回值

第二個引數:操作標誌

ipc_creat - 建立訊息佇列

ipc_excl - 與ipc_creat搭配使用,存在則建立失敗

0   - 表示獲取已存在的訊息佇列

返回值:成功返回訊息佇列的id,失敗返回-1

函式功能:主要用於獲取乙個訊息佇列的id

注意:當建立乙個新的訊息佇列時,需要在第二個引數中指定訊息佇列的許可權,如:0644

(3)傳送/接受訊息佇列中的訊息,使用msgsnd/msgrcv函式

msgsnd函式

#include

#include

#include

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

第乙個引數:訊息佇列的id,msgget函式的返回值

struct msgbuf 

;第三個引數:訊息的大小

指訊息內容的大小,不包括訊息的型別

第四個引數:傳送的方式,一般給0即可

函式功能:主要用於傳送指定的訊息到指定的訊息佇列中

msgrcv函式

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

第乙個引數:訊息佇列的id,msgget函式的返回值

第三個引數:訊息的大小

第四個引數:訊息的型別

0  - 讀取訊息佇列中的第乙個訊息

>0 - 讀取訊息佇列中第乙個型別為msgtyp的訊息

<0 - 讀取訊息佇列中<=msgtyp絕對值的訊息,最小的優先讀取

第五個引數:接受的方式,一般給0即可

返回值:成功返回接受的訊息大小,失敗返回-1

函式功能:主要用於從指定的訊息佇列中接受訊息

(4)如果不再使用,則刪除訊息佇列,使用msgctl函式

msgctl函式

#include

#include

#include

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

第乙個引數:訊息佇列的id,msgget函式的返回值

第二個引數:操作的命令

ipc_rmid - 刪除指定的訊息佇列,第三個引數給null

第三個引數:結構體指標

函式功能:主要用於對指定的訊息佇列執行指定的操作

程序間訊息佇列通訊

要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...

程序間通訊(訊息佇列)

在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...

程序間通訊 訊息佇列

有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...