2012-12-18 39 views
4

我在linux上創建消息隊列時遇到問題。我收到的錯誤是「無效的參數」。我需要的另一件事是代碼是Qt項目的一部分。POSIX消息隊列 - 打開時出錯:無效參數

常見的錯誤是名稱不以(/)開頭,arg的數目不正確,但我已經檢查過這些!

這裏是我試圖運行代碼:

#define MQ_TEST_PATH   "/test_queue" 
#define MQ_MAX_MSG_SIZE   256 
#define MQ_MAX_MSG_COUNT  20 

struct mq_attr mqAttr; 
mqAttr.mq_maxmsg = MQ_MAX_MSG_COUNT; 
mqAttr.mq_msgsize = MQ_MAX_MSG_SIZE; 

mq_unlink(MQ_TEST_PATH); 

mode_t mode = S_IRUSR | S_IWUSR; 
int oflags = O_WRONLY | O_CREAT | O_EXCL; 

mqd_t mqd; 
mqd = mq_open(MQ_TEST_PATH, oflags, mode, &mqAttr); 

if(mqd < 0){ 
    perror("Error on open"); 
    qDebug()<<mqd; 
    return 0; 
} 

mq_close(mqd); 
mq_unlink(MQ_TEST_PATH); 

輸出:

Error on open: Invalid argument 
-1 
+0

當mq_open的最後一個參數(隊列屬性)更改爲NULL並且它工作時。但我不知道msg大小和隊列最大長度的默認值。 – DimDqkov

回答

7

人mq_open

EINVALO_CREAToflag指定,並attr不是NULL,但是attr->mq_maxmsgattr->mq_msqsize無效。這兩個字段必須大於零。在一個過程,是無特權的(不具有CAP_SYS_RESOURCE能力),attr->mq_maxmsg必須小於或等於msg_max極限

人mq_overview

> 的/ proc/SYS/FS/mqueue中/ msg_max

爲msg_max的默認值是10。

+0

謝謝,這是問題所在。我可以問你,你是如何從錯誤代碼中得到錯誤EINVAL的。我怎樣才能讓我的項目具備CAP_SYS_RESOURCE功能?我對Linux很陌生。 – DimDqkov

+0

使用** errno **全局變量在最近的系統調用後出現錯誤。見男人errno,男人perror。至於CAP_SYS_RESOURCE功能 - 你真的需要它嗎?可能最好的解決方案是在分配隊列屬性之前檢查當前的限制(請參閱man getrlimit)。如果您確實需要更改限制,請將其作爲特權用戶在單獨的腳本中執行。您可以將所需的值寫入/ proc/sys/fs/mqueue/msg_max和/ proc/sys/fs/mqueue/msgsize_max(參見man mq_overview) –

+1

'getrlimit(RLIMIT_MSGQUEUE,...)'似乎給出了最大數目隊列佔用的字節數。 '/ proc/sys/fs/mqueue/msg_max'給出了消息的最大尺寸,但是我找不到從我的C程序中讀取這個值的合理方法。你做?理想情況下,我會讓用戶設置郵件大小,但將其限制爲此值。 – Gauthier