Linux程序通訊之訊息佇列的雙向通訊

2021-08-02 11:47:42 字數 3010 閱讀 8266

#include 

#include

#include

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

其中msg***表示生成訊息佇列的方式和許可權,一般使用的話,有三個常用引數,ipc_creat、ipc_excl、umask,ipc_creat單獨使用時代表如果沒有此訊息佇列,那就生成乙個,如果當前的訊息佇列存在,那就開啟它;ipc_excl單獨使用沒有任何意義,至少目前沒有;二者同時使用表示如果沒有此訊息佇列,則生成乙個,如果有,那就出錯並返回。而umask表示建立的當前的訊息佇列的許可權,採用8進製表示。

解釋一下,key值標識乙個唯一的訊息佇列, 可以由系統指定產生,也可以由使用者自己指定乙個。在key的地方傳ipcprivate時表示系統指定key值。自定義生成key時,需要呼叫ftok函式。

#include 

#include

key_t ftok(const

char *pathname, int proj_id);

pathname表示當前檔案的名稱或路徑,proj_id可以忽略直接設為0。

則執行完msgget函式後,返回乙個msgid。

首先我們要知道一點,因為之前說過訊息佇列是按資料塊進行通訊的,所以每個傳送貨接收的訊息資料都在乙個個的塊裡,每個塊由乙個結構體表示:

struct msgbuf ;
傳送函式:

#include 

#include

#include

int msgsnd(int msqid, const

void *msgp, size_t msgsz, int msg***);

msgp表示這個結構體的位址,msgsz表示塊中資料字段的長度,msg***也忽略直接設為0;應注意,因為msgsnd函式中沒有傳入資料的型別和具體字串,這就要求我們在傳入結構體的時候,將結構體裡面的兩個欄位都設定好。

接收函式:

#include 

#include

#include

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

int msg***);

msgp、msgsz、msg***的表示不變,msgtyp表示需要顯式的傳入型別。

在使用完畢訊息佇列後,我們要銷毀建立的訊息佇列,防止占用系統資源。有兩種方法可以做到:

1、直接在終端鍵入命令

ipcs -q:顯式當前系統中的所有訊息佇列;

ipcrm -q [msgpid]:跟上msgid表示刪除對應msgid的訊息佇列。

2、呼叫msgctl函式,顧名思義,控制函式,傳入對應的引數就可以終止乙個訊息佇列:

#include 

#include

#include

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

cmd處傳入ipc_rmid就表示刪除對應的訊息佇列,後面的引數可以先不管,直接傳入null即可。

實現消佇列的**:

#include 

#include

#include

#include

#include

#define text_size 1024

#define server_type 1

#define client_type 10

struct msgbuf

;struct msgbuf msg;

int creatmsgid();

int getmsgid();

int msgsend(int msgid,long types,const

char* buffer);

int msgreceive(int msgid,long types,char* buffer);

int destroymsg(int msgid);

#include "comm.h"

static key_t getkey()

int creatmsgid()

return msgid;

}int getmsgid()

int msgsend(int msgid,long types,const

char* buffer)

return0;}

int msgreceive(int msgid,long types,char* buffer)

printf("%s\n",msg.mtext);

return size;

}int destroymsg(int msgid)

printf("message destroy done...\n");

return

0;}

#include "comm.h"

int main()

destroymsg(msgid);

return

0;}

client.c

#include "comm.h"

int main()

return

0;}

實現結果:

因為是阻塞方式實現的訊息佇列,所以只能等待傳送或接收的操作完成後,再完成另外乙個。

所以的最後在client say#的時候我就放棄傳送了,因為server還沒有傳送,處在阻塞狀態,不可能傳送。

較大的傳不上來,所以這個幀數較小。

Linux程序通訊之訊息佇列

訊息佇列主要由下面四個函式組成 1 msgget 2 msgctl 3 msgsnd 3 msgrcv 1 msgget 得到訊息佇列識別符號或建立乙個訊息佇列物件並返回訊息佇列識別符號 include include include intmsgget key t key,int msg 注意 這...

linux程序間通訊之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。include include include include include include in...

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...