linux程序間通訊之 訊息佇列

2021-09-10 19:58:15 字數 2813 閱讀 2965

訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。

儘管訊息對了在某些方面與管道和fifo類似,但是它們還是存在顯著的差別

訊息佇列有system v和posix介面之分,這裡我們討論的是systemv中的訊息佇列。

1、引用訊息佇列的控制代碼是由msgget()呼叫返回的識別符號,這些識別符號和其他unix系統上其他形式的i/o所使用的檔案描述符是不同的;

2、訊息佇列是面向訊息的,是寫入的一整條訊息。管道是無法區分邊界的位元組流;

3、除了包含資料外,每條訊息還有乙個整數表示訊息的型別,所以訊息佇列除了能按順序先入先出,還能按照型別來讀取訊息

1、建立訊息佇列 or 取得乙個既有佇列的識別符號

#include #include int msgget(key_t key, int msg***);
key:唯一訊息佇列的id,可以使用ftok()獲得,也可以認為指定(和共享記憶體類似)

#include

#include

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

msg***:標識函式的行為,施加許可權或者檢查既有佇列許可權的掩碼

ipc_creat:如果沒有與指定key對應的佇列,則建立乙個新佇列

ipc_excl:同時指定ipc_creat時,如果存在key對應的佇列則失敗

2、傳送訊息

int msgsnd(int msqid, const void *msgp,size_t msgsz,int msg***);
msqid:訊息佇列的佇列id。

msgsz:訊息正文的位元組數。

msg***:函式的控制屬性

0:msgsnd呼叫阻塞直到條件滿足為止。

ipc_nowait:若訊息沒有立即傳送則呼叫該函式的程序會立即返回。

3、接收訊息

ssize_t msgrcv(int msqid, void *msgp,size_tmsgsz,long msgtyp, int msg***);
msqid:訊息佇列的id,代表要從哪個訊息列中獲取訊息。

msgsz:訊息正文的位元組數。

msgtyp:訊息的型別、可以有以下幾種型別

= 0:返回佇列中的第乙個訊息

> 0:返回佇列中訊息型別為msgtyp的訊息

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

msg***:函式的控制屬性

0:msgrcv呼叫阻塞直到接收訊息成功為止。

msg_noerror:若返回的訊息位元組數比nbytes位元組數多,則訊息就會截短到nbytes位元組,且不通知訊息傳送程序。

ipc_nowait:呼叫程序會立即返回。若沒有收到訊息則立即返回-1。

4、控制訊息佇列

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
如修改訊息佇列的屬性,或刪除訊息訊息佇列

msqid:訊息佇列的id

cmd:函式功能的控制

/proc/sys/kernel/msgmni  規定了訊息佇列能建立識別符號的數量

/proc/sys/kernel/msgmax  單條訊息最多寫入位元組數

/proc/sys/kernel/msgmnb  一條訊息佇列中最多儲存的位元組數

同時還可以使用shell命令操作訊息佇列

檢視訊息佇列ipcs -q  

刪除訊息佇列ipcrm -q msgid

傳送方:

#include #include #include #include #include #include #include #define  bufsize 100

struct msg

;void main()

//建立訊息佇列

msgid = msgget(key,ipc_creat|0666);

if( msgid < 0)

//向訊息佇列中寫入資料,輸入eof結束

while(1)

printf("傳送完成\n");

if( strcmp(buf,"eof") == 0)

}printf("程式結束\n");

return;

}

接收方

#include #include #include #include #include #include #include #define bufsize 100

struct msg

;void main()

//建立訊息佇列

msgid = msgget(key,ipc_creat|0666);

if( msgid < 0)

//從訊息佇列中讀取訊息,遇到eof結束

while(1)else

if( strcmp(bufmsg.text,"eof") == 0)

}//刪除訊息佇列

if(msgctl(msgid,ipc_rmid,0) < 0)

printf("刪除訊息佇列\n");

printf("程式結束\n");

return;

}

linux程序間通訊之訊息佇列

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

linux程序間通訊之訊息佇列

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

Linux程序間通訊之訊息佇列

實現功能 編寫程式sender,它建立乙個訊息佇列 然後,迴圈等待使用者通過終端輸入一串字元,將這串字元通過訊息佇列傳送給receiver,直到使用者輸入 bye 為止 最後,它向receiver程序傳送訊息 end 並且等待receiver的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...