2013-03-31 85 views
1

當我試圖減少POSIX消息隊列中的消息數時,它的最大維護數爲10.是否可以減少或增加POSIX消息隊列中的消息數?調整posix消息隊列中的消息數

以下代碼將消息發送到POSIX消息隊列。餘設置的最大消息(MQ_MAX_NUM_OF_MESSAGES)至5,但它發送10個消息

send.c

#include <stdio.h> 
#include <mqueue.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <time.h> 
#include <string.h> 

#define MSGQOBJ_NAME "/myqueue123" 
#define MAX_MSG_LEN  70 
#define MQ_MESSAGE_MAX_LENGTH 70 
#define MQ_MAX_NUM_OF_MESSAGES 5 
struct mq_attr attr; 

int main(int argc, char *argv[]) 
{ 
mqd_t msgq_id; 
unsigned int msgprio = 0; 
pid_t my_pid = getpid(); 
char msgcontent[MAX_MSG_LEN]; 
int create_queue = 0; 
char ch;   /* for getopt() */ 
time_t currtime; 

attr.mq_flags = 0; 
attr.mq_maxmsg = MQ_MAX_NUM_OF_MESSAGES; 
attr.mq_msgsize = MQ_MESSAGE_MAX_LENGTH; 
attr.mq_curmsgs = 0; 

while ((ch = getopt(argc, argv, "qp:")) != -1) { 
    switch (ch) { 
     case 'q': /* create the queue */ 
      create_queue = 1; 
      break; 
     case 'p': /* specify client id */ 
      msgprio = (unsigned int)strtol(optarg, (char **)NULL, 10); 
      printf("I (%d) will use priority %d\n", my_pid, msgprio); 
      break; 
     default: 
      printf("Usage: %s [-q] -p msg_prio\n", argv[0]); 
      exit(1); 
    } 
} 
if (msgprio == 0) { 
    printf("Usage: %s [-q] -p msg_prio\n", argv[0]); 
    exit(1); 
} 
if (create_queue) { 
    msgq_id = mq_open(MSGQOBJ_NAME, O_RDWR | O_CREAT | O_EXCL, S_IRWXU | S_IRWXG, NULL); 
} else { 
    msgq_id = mq_open(MSGQOBJ_NAME, O_RDWR); 
} 
if (msgq_id == (mqd_t)-1) { 
    perror("In mq_open()"); 
    exit(1); 
} 

currtime = time(NULL); 
snprintf(msgcontent, MAX_MSG_LEN, "Hello from process %u (at %s).", my_pid, ctime(&currtime)); 
mq_send(msgq_id, msgcontent, strlen(msgcontent)+1, msgprio); 
mq_close(msgq_id); 
return 0; 
} 
+0

看來你沒有將屬性結構傳遞給mq_open call.Pass它作爲最後一個參數,而不是NULL –

回答

4

linux manual page對於POSIX消息隊列,可以讀取如何通過調相關內核配置/ proc文件系統。

特別的/ proc/SYS/FS/mqueue中/ msg_max是你在找什麼:

這個文件可以用來查看和更改上限值中的最大消息數一個隊列。此值在給予mq_open(3)的attr-> mq_maxmsg參數上充當天花板。 msg_max的默認值爲10.最小值爲1(在2.6.28之前的內核中爲10)。上限爲HARD_MAX:(131072/sizeof(void *))(Linux/86上的32768)。 對於特許進程(CAP_SYS_RESOURCE),此限制將被忽略,但HARD_MAX限額仍然強制執行。

編輯
mq_open(2)mq_getattr(3)mq_send(3)手冊頁所解釋的,mq_maxmsg值設置消息隊列可以不受阻塞(或在的情況下,返回EAGAIN處理的最大數目非阻塞隊列)。如果mq_open隊列的mq_maxmsg = 5並且內核配置爲/proc爲10(默認AFAIK),則隊列將接受5個沒有阻塞的消息。如果您使用mq_maxmsg = 15打開一個隊列,並且/proc中的內核配置爲10,則隊列將接受10條消息。也就是說:您可以創建一個隊列來保存最大數量的消息,該數量低於內核接受的最大消息數量,但不會更大。

+0

謝謝。那麼mq_attr結構中的mq_maxmsg有什麼用處。 – sujin

+1

在編輯中解釋。順便說一句,Linux手冊頁在那裏爲你... :-) –