程序間通訊 訊息佇列

2021-10-13 09:53:33 字數 3642 閱讀 2785

場景:同一臺linux裝置下,多個程序之間資料要互相通訊,就可以使用訊息佇列進行資料傳輸。

訊息佇列(message queue):是訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識

訊息佇列提供了乙個從乙個程序向另乙個程序傳送資料塊的方法,每個資料塊都可以被認為是有乙個型別,接收者接受的資料塊可以有不同的型別。

訊息佇列函式:

1、msgget

功能:建立和訪問乙個訊息佇列

原型:#include #include #include int msgget(key_t key, int msgflag);

引數:key:訊息佇列名稱,用ftok()產生

msgflag:ipc_creat或者ipc_excl,如果訊息佇列不存在則建立之,如果存在則開啟返回;單獨使用ipc_excl是沒有意義的;兩個同時使用,如果訊息佇列不存在則建立之,如果存在則出錯返回。

返回值:成功返回非負整數,即訊息佇列的標識碼,失敗返回-1

2、ftok

功能:建立訊息佇列名稱

原型:#include #include key_t ftok(const char *pathname, int proj_id);

返回值:成功返回乙個key值,用於建立訊息佇列,失敗返回-1

3、msgctl

功能:訊息佇列的控制函式

原型:#include #include #include int msgctl(int msqid, int cmd, struct msqid_ds *buf);

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

cmd:命令,這邊有三個命令

ipc_stat把msqid_ds結構中的資料設定為訊息佇列的當前關聯值

ipc_set在程序有足夠許可權的前提下,把訊息佇列的當前值設定為msqid_ds資料結構中給出的值

ipc_rmid刪除訊息佇列

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

4、msgsnd

功能:把一條訊息新增到訊息佇列中

原型:#include #include #include int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

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

msgp:指標指向準備傳送的訊息

msgsz:msgp指向的訊息的長度

msg***:預設為0

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

傳送的訊息結構:

struct msgbuf

;

5、msgrcv

功能:從乙個訊息佇列接收訊息

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

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

msgp:指標指向準備傳送的訊息

msgsz:msgp指向的訊息的長度

msgtyp:訊息型別

type==0,返回佇列中第乙個訊息

type > 0, 返回佇列中訊息型別為type的第乙個訊息

type < 0, 返回佇列中訊息型別值小於或等於type絕對值的訊息,如果這種訊息有若干個,則取型別值最小的訊息

msg***:預設為0

上原始碼:

#ifndef _comm_h_

#define _comm_h_

#include #include #include #include #include #include struct msgbuf

;#define server_type 1

#define client_type 2

int createmsgqueue();

int getmsgqueue();

int destorymsgqueue(int msg_id);

int sendmsgqueue(int msg_id, int who, char *msg);

int recvmsgqueue(int msg_id, int recvtype, char out);

#endif

#include "comm.h"

static int commmsgqueue(int cmd)

int msg_id = msgget(key, cmd);

if(msg_id < 0)

return msg_id;

}int createmsgqueue()

int getmsgqueue()

int destorymsgqueue(int msg_id)

return 0;

}int sendmsgqueue(int msg_id, int type, char *msg)

return 0;

}int recvmsgqueue(int msg_id, int recvtype, char out)

strncpy(out, buf.mtext, size);

out[size] = 0;

return 0;

}

#include "comm.h"

int main()

; while(1)*/}

destorymsgqueue(msgid);

return 0;

}

#include "comm.h"

int main()

; while(1)

//recvmsgqueue(msgid, server_type, buf);

//printf("server#%s\n", buf);

}return 0;

}

編譯執行client、server。

client傳送訊息:

[root@live*** tmp]# ./client

msgid:360448

please enter:aaaa

please enter:bbbbb

please enter:heiil

please enter:quit

[root@live*** tmp]#

server接收訊息:

[root@live*** tmp]# ./server

msgid = 360448

client:aaaa

client:bbbbb

client:heiil

[root@live*** tmp]#

ipcs -q :檢視ipc資源

ipcrm -q:刪除ipc資源

參考:

程序間訊息佇列通訊

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