訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。
儘管訊息對了在某些方面與管道和fifo類似,但是它們還是存在顯著的差別
訊息佇列有system v和posix介面之分,這裡我們討論的是systemv中的訊息佇列。
1、引用訊息佇列的控制代碼是由msgget()呼叫返回的識別符號,這些識別符號和其他unix系統上其他形式的i/o所使用的檔案描述符是不同的;1、建立訊息佇列 or 取得乙個既有佇列的識別符號2、訊息佇列是面向訊息的,是寫入的一整條訊息。管道是無法區分邊界的位元組流;
3、除了包含資料外,每條訊息還有乙個整數表示訊息的型別,所以訊息佇列除了能按順序先入先出,還能按照型別來讀取訊息
#include #include int msgget(key_t key, int msg***);
key:唯一訊息佇列的id,可以使用ftok()獲得,也可以認為指定(和共享記憶體類似)
#includemsg***:標識函式的行為,施加許可權或者檢查既有佇列許可權的掩碼#include
key_t ftok(const char *pathname, int proj_id);
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的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...