【问题标题】:adjust number of messages in posix message queue调整posix消息队列中的消息数
【发布时间】:2013-03-21 15:12:54
【问题描述】:

当我尝试减少 POSIX 消息队列中的消息数量时,它保持最大为 10。是否可以减少或增加 POSIX 消息队列中的消息数量?

以下代码将消息发送到 POSIX 消息队列。我将最大消息(MQ_MAX_NUM_OF_MESSAGES)设置为 5,但它发送 10 条消息

发送.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;
}

【问题讨论】:

  • 您似乎没有将属性结构传递给 mq_open 调用。将其作为最后一个参数传递,而不是 NULL

标签: c linux posix message-queue


【解决方案1】:

在 posix 消息队列的linux manual page 中,您可以阅读如何通过 /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_maxmsg = 5 mq_open 一个队列,并且 /proc 中的内核配置为 10(默认值,AFAIK),那么队列将接受 5 条消息而不会阻塞。如果您使用 mq_maxmsg = 15 mq_open 一个队列,并且 /proc 中的内核配置为 10,则该队列将接受 10 条消息。即:您可以创建一个队列,该队列的最大消息数低于内核接受的最大消息数,但不大于内核接受的最大消息数。

【讨论】:

  • 谢谢。那么mq_attr结构中的mq_maxmsg有什么用。
  • 在编辑中解释。顺便说一句,Linux 手册页适合您... :-)
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 2019-03-17
  • 2020-04-18
  • 1970-01-01
  • 2011-07-10
  • 2014-02-13
  • 2016-03-21
  • 2015-04-12
相关资源
最近更新 更多