Linux訊息佇列實現程序間通訊

2021-08-01 23:56:32 字數 3054 閱讀 4389

什麼是訊息佇列:

訊息佇列提供了從乙個程序向另乙個程序傳送乙個有型別資料塊的方法。用這種方法可以避免命名管道的同步和阻塞問題。訊息佇列是基於訊息的,而管道是基於位元組流的,並且訊息佇列的讀取不一定是先入先出。

訊息佇列的操作:

訊息佇列的建立或者獲取:

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

引數描述:

key:是乙個埠號,可以由ftok()生成

msg***:  ipc_creat:如果ipc不存在,則建立,存在就開啟

ipc_execl:單獨使用無太大意義,與ipc_creat一塊使用代表,ipc不存在建立,存在出錯,返回

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

生成唯一乙個key供使用者使用,返回乙個訊息佇列識別符號。

返回值:

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

讀取訊息:

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

引數描述:

msgid:訊息佇列的識別符號

msgp:指向乙個緩衝區的指標,用來暫時存放儲存傳送和接受的訊息,是乙個使用者可以定義的通用結構。

struct msgstru;

msgz:訊息的大小

msgtyp:從訊息佇列中讀取的訊息形態

msg***:用來指明核心程式在佇列沒有資料的情況下所應採取的行動。如果msg***和常 數ipc_nowait合用,則在msgsnd()執行時若是訊息佇列已滿,則msgsnd()將不會阻塞,而 會立即返回-1,如果執⾏行的是msgrcv(),則在訊息佇列呈空時,不做等待馬上返回-1,並設定 錯誤碼為enomsg。當msg***為0時,msgsnd()及msgrcv()在佇列呈滿或呈空的情形時,採取 阻塞等待的處理模式。

返回值:

成功返回實際讀取到的位元組數,失敗返回-1。

傳送訊息:

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

引數與讀取訊息函式的引數相同。

返回值;

成功返回0,失敗返回-1。

訊息佇列的檢視:

可以使用 ipcs -q 來檢視系統中的訊息佇列;

可以使用ipcrm -q +訊息佇列id  來刪除對應id的訊息佇列

訊息佇列的例項:

實現乙個server和乙個client程式,他們之間利用訊息佇列進行通訊。

comm.h

#ifndef  _comm_h_

#define _comm_h_

#ifndef _comm_h_

#define _comm_h_

#include#include#include#include#include#define pathname "."

#define proj_id 0x666

#define server_type 1

#define client_type 2

//自定義乙個緩衝區用來暫時儲存傳送或者接收的資料

struct msgbuf

;int createmsgqueue();

int getmsgqueue();

int destroymsgqueue(int msgid);

int sendmsg(int msgid, int type, char *msg);

int recvmsg(int msgid, int recvtype, char out);

#endif

comm.c

#include "comm.h"

//建立或者開啟訊息佇列

static int commmsgqueue(int flag)

//根據flag的不同選擇開啟還是建立

int msgid = msgget(key, flag);

if(msgid < 0)

return msgid;

}int createmsgqueue()

int getmsgqueue()

int destroymsgqueue(int msgid)

return 0;

}//傳送訊息(引數:傳送者,傳送內容的型別,傳送的內容)

int sendmsg(int msgid, int who, char *msg)

return 0;

}//接收訊息(引數:接受者,接受型別,接受之後存放位置)

int recvmsg(int msgid, int who, char out)

//將資料從緩衝區存放到指定位置

strcpy(out, buf.mtext);

return 0;

}

server.c

#include"comm.h"

int main()

}//伺服器端建立,伺服器端銷毀訊息佇列

destorymsgqueue(msgid);

return 0;

}

client.c

#include "comm.h"

int main()

//接受伺服器的回應

recvmsg(msgid, server_type, buf);

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

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