訊息佇列使用注意的地方(argument list too long)linux
阿新 • • 發佈:2019-01-27
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);
很多人在使用的時候都不會在意引數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在這裡我們就可以看到某個msgid下發來多少條訊息以及訊息的長度。 |