当我尝试减少POSIX消息队列中的消息数时,其最大值为10.是否可以减少或增加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 :(得分:8)
在posix消息队列的linux manual page中,您可以阅读如何通过 / proc 文件系统调整相关内核配置。
特别是 / proc / sys / fs / mqueue / msg_max 正在寻找:
此文件可用于查看和更改队列中最大消息数的上限值。此值在mq_open(3)的attr-&gt; 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_open mq_maxmsg = 15的队列并且 / proc 中的内核配置为10,则队列将接受10条消息。也就是说:您可以创建一个队列,其中包含的最大消息数小于内核接受的最大消息数,但不会更大。