Linux 程序間通訊之訊息佇列的幾點注意事項

2021-06-05 10:02:09 字數 1544 閱讀 6966

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的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...