程序間通訊 訊息佇列

2021-08-20 11:11:48 字數 3580 閱讀 8250

訊息佇列

實際上是核心中的乙個鍊錶。

可在linux下的 /usr/include/linux/msg.h檢視訊息佇列結構

訊息佇列在核心中的表示

msgget函式 - 建立訪問訊息佇列

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

引數:key:乙個訊息佇列的名字

msg***:許可權

返回值:

成功返回訊息佇列的標識碼,給後續的msgctl,msgsen,msgrcv使用

失敗返回 -1

msg***:

ipc_creat:不存在就建立,存在就開啟

ipc_excl : 加上這個選項,存在就開啟失敗

key值的產生:

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

引數 : 

pathname :是乙個路徑,只要確保是當前系統中乙個存在的目錄即可

pro_id :表示同一專案中不同的訊息佇列

返回值:

成功返回非負數

失敗返回小於0的值

msgctl

函式 - 控制訊息佇列

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

引數 : 

msqid :由msgget所獲得的標識碼

cmd : 相應操作

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

cmd有三值可取,我們最經常用的是 ipc_rmid,意義為刪除訊息佇列,且不需要函式的第三個引數。

msgsnd函式 - 新增一條訊息到訊息佇列中

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

引數 msgid: 由msgget函式返回的訊息佇列標識碼 

msgp:是⼀個指標,指標指向準備傳送的訊息

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型

msg***:控制著當前訊息佇列滿或到達系統上限時將要發⽣的事情 msg***=ipc_nowait表⽰佇列滿不等待,返回eagain錯誤。 

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

訊息結構體的形式如下

struct msgbuf

msgrcv函式 - 從訊息佇列接收訊息

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

引數 msgid: 由msgget函式返回的訊息佇列標識碼 

msgp:是⼀個指標,指標指向準備接收的訊息

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型 

msgtype:它可以實現接收優先順序的簡單形式 

msg***:控制著佇列中沒有相應型別的訊息可供接收時將要發⽣的事 

返回值:成功返回實際放到接收緩衝區⾥去的字元個數,失敗返回-1

**實現service和client的互動

伺服器先啟動,且7*24小時執行,客戶端主動發起請求,服務端被動接收請求,客戶端傳送的請求不同,服務端會返回不同的結果。

此次互動所涉及的動作

#pragma once

#include #include #define client_type 1

#define server_type 2

typedef struct msgbuf

msgbuf;

int createmsgqueue();

int openmsgqueue();

void destorymsgqueue();

void sendmsgqueue(int msgid,int type,char* msg);

void receivemsgqueue(int msgid,int type,char out);

#include "com.h"

#include #include #include #include int commend(int flags)

int msgid = msgget(key,flags);

if(msgid < 0)

return msgid;

}int createmsgqueue()

int openmsgqueue()

void destorymsgqueue()

}void sendmsgqueue(int msgid,int type,char* msg)

}void receivemsgqueue(int msgid,int type,char out)

strcpy(out,buf.mtest);

}

service接收客戶端發來的訊息,並對其進行相應
#include "com.h"

#include #include int main()

; while(1)

destorymsgqueue();

return 0;

}

client想伺服器傳送訊息,並相應伺服器發回的訊息

#include "com.h"

#include #include int main()

; while(1)

return 0;

}

客戶端傳送請求並等待伺服器響應

伺服器端接收客戶端訊息並相應客戶端

通過 ipcs -q 檢視剛剛建立的訊息佇列

通過 ipcrm -q [msgid] 刪除已有的訊息佇列

訊息佇列總結

程序間訊息佇列通訊

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