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