1. 由於訊息佇列是屬於核心的,因此在執行時,必須有root許可權才可以,否則會在訪問訊息佇列時,出現eacces錯誤,即訪問許可權的問題
2. msgbuf.mtype的設定
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);
msgp指向結構體:
struct msgbuf ;
mtext欄位是乙個陣列,或是別的結構體
mtype欄位必須是乙個正整型數值(否則會導致錯誤:einval)
3. 用訊息佇列傳輸結構體
方法一:
對上面的結構體進行欄位的擴充套件的話,接收的時候會有問題
如定義結構體msgbuf來傳送和接收
typedef struct _msgbuf
msgbuf, * pmsgbuf;
方法二:
不過可以讓mtext來儲存結構體中的內容,然後傳送出去,即進行結構體的巢狀(可行);
需要注意的是,在傳送巢狀的訊息時,只能定義固定大小的結構體,即msgbuf.mtext欄位是有長度固定的
字元陣列
下例中傳輸乙個結構體:
typedef struct _msgtype
msgtype, * pmsgtype;
const int nmsgtypesize=sizeof(msgtype);
傳送**如下:
//mtext
char tempbuf[nmsgtypesize]=;
pmsgtype msgtype=(pmsgtype)tempbuf;
msgtype->datalen=10;
strcpy(msgtype->sendname, "byh");
strcpy(msgtype->recvname, "zqy");
strcpy(msgtype->data, "i love u");
//填充訊息
msgbuf sendbuf;
sendbuf.mtype=1;
memset(sendbuf.cmdcontent, 0, ncmdcontentsize);
//將巢狀結構體的內容儲存在msgbuf的字段mtext中
memcpy(sendbuf.cmdcontent, tempbuf, nmsgtypesize);
//成功返回0,否則返回-1
int nret=msgsnd(m_msgqueueid, &sendbuf, ncmdcontentsize, sflags);
if(nret==-1)
試驗成功
輸出結果如下:
從佇列中接收訊息成功
datalen=10sendname=byhrecvname=zqydata=i love u
4. 傳送動態大小型別的訊息
這種好像比較糾結。因為,如果訊息佇列中的訊息是不固定長度的,而且訊息佇列中有n條訊息的話,由於可能會取多或者取少,從而導致整個訊息佇列的混亂
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的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...