1. 程式人生 > >訊息佇列使用注意的地方(argument list too long)linux

訊息佇列使用注意的地方(argument list too long)linux

Linux提供了一系列訊息佇列的函式介面來讓我們方便地使用它來實現程序間的通訊(IPC)。

本文不講詳細的使用,詳細請參考  http://blog.csdn.net/ljianhui/article/details/10287879

今天只講在使用msgsnd()和msgrcv()函式一些注意的地方。

首先我們先看看這兩個函式的原型:

msgrcv函式:該函式用來從一個訊息佇列獲取訊息,它的原型為

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, longint msgtype, int msgflg);

msgsnd函式:該函式用來把訊息新增到訊息佇列中。它的原型為: int
 msgsend(int msgid, constvoid *msg_ptr, size_t msg_sz, int msgflg);

很多人在使用的時候都不會在意引數msg_sz,而且網上很多地方的示例程式碼也都有誤。msg_sz是msg_ptr指向的訊息的長度,注意是訊息的長度,而不是整個結構體的長度,也就是說msg_sz是不包括長整型訊息型別成員變數的長度。

在使用訊息佇列之前都會頂一個結構體,用於存發資料,msg_sz就等於MSG_SIZE。

struct msgstru{ long msgtype; //大於0 char msgtext[MSG_SIZE]; }; 接受的這個結構體的訊息的長度不能小於傳送的結構體的資料訊息的長度,否則就會導致程式掛死,出現argument list too long
的錯誤資訊。
檢視傳送來的資料訊息的長度,可以用 ipcs -q 這一指令,會列出系統中存在的訊息佇列, key        msqid      owner      perms      used-bytes   messages
在這裡我們就可以看到某個msgid下發來多少條訊息以及訊息的長度。