C 有没有办法增加SysV消息队列中可以包含的最大消息量?

C 有没有办法增加SysV消息队列中可以包含的最大消息量?,c,ipc,message-queue,sysv,sysv-ipc,C,Ipc,Message Queue,Sysv,Sysv Ipc,我刚从POSIX切换到SysV,因为SysV上的限制要高得多(1024 vs 10)。但我还是需要一个更高的限制。限制应该在运行时更改,因为它取决于用户选择的数据 使用POSIX,可以增加限制,但每次都必须以root用户身份运行代码,我不能这样做 有没有办法提高SysV的限制?由于SysV IPC被认为是不受欢迎的,用那些老式的服务设计全新的应用程序是很遗憾的 POSIX消息队列基于文件系统。它通常安装在/dev/mqueue上: $ls-la/dev/mqueue 总数0 DRWXRWT 2根

我刚从POSIX切换到SysV,因为SysV上的限制要高得多(1024 vs 10)。但我还是需要一个更高的限制。限制应该在运行时更改,因为它取决于用户选择的数据

使用POSIX,可以增加限制,但每次都必须以root用户身份运行代码,我不能这样做


有没有办法提高SysV的限制?

由于SysV IPC被认为是不受欢迎的,用那些老式的服务设计全新的应用程序是很遗憾的

POSIX消息队列基于文件系统。它通常安装在/dev/mqueue上:

$ls-la/dev/mqueue
总数0
DRWXRWT 2根根40十二月25日21:02。
drwxr-xr-x 20根根4600十二月25日20:51。。
使用创建消息队列。attr参数提供设置某些属性的功能:

struct mq\u attr{
长mq_标志;/*标志(对于mq_open()忽略)*/
队列上消息的长mq_maxmsg;/*最大值*/
长mq_msgsize;/*最大消息大小(字节)*/
队列中当前消息的长mq_curmsgs;/*#(mq_open()忽略)*/
};
根据,/proc/sys/fs/mqueue/msg_max文件定义队列中最大消息数的上限值。在Linux 5.4中,其默认值为DFLT_MSGMAX(10),上限为HARD_MSGMAX(65536)

默认值在Linux源代码中定义(cf./include/Linux/ipc_namespace.h):

#定义DFLT#U队列最大256
#定义最小值MSGMAX 1
#定义DFLT\U MSG 10U
#定义DFLT_MSGMAX 10
#定义硬的\u MSGMAX 65536
#定义最小值MSGSIZEMAX 128
#定义DFLT\U MSGSIZE 8192U
#定义DFLT_MSGSIZEMAX 8192
#定义硬_MSGSIZEMAX(16*1024*1024)
下面是一个创建消息队列的示例程序。它接收消息队列名称和队列中最大消息数作为参数:

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
mqd_t mqdes;
结构mq_attr attr;
如果(argc!=3){
fprintf(stderr,“用法:%s\n”,argv[0]);
退出(退出失败);
}
attr.mq_标志=0;
attr.mq_maxmsg=atoi(argv[2]);
attr.mq_msgsize=2048;
attr.mq_curmsgs=0;
mqdes=mq_open(argv[1],O_CREAT | O_RDWR,0777和attr);
如果(mqdes==(mqd_t)-1){
perror(“mq_open”);
返回1;
}
返回0;
}
在执行时,我们可以验证,默认情况下,队列不能超过10条消息:

$gcc mq.c-o mq-lrt
$./mq
用法:./mq
$./mq/q0 5
$ls-la/dev/mqueue/
总数0
DRWXRWT 2根根根60年12月25日21:09。
drwxr-xr-x 20根根4600十二月25日20:51。。
-RWXR-x 1 xxxx xxxx 80十二月25日21:09 q0
$./mq/q1 9
$./mq/q2 10
$./mq/q3 11
mq_open:参数无效
$ls-la/dev/mqueue/
总数0
DRWXRWT 2根根100十二月25日21:10。
drwxr-xr-x 20根根4600十二月25日20:51。。
-RWXR-x 1 xxxx xxxx 80十二月25日21:09 q0
-RWXR-x 1 xxxx xxxx 80十二月25日21:10第一季度
-RWXR-x 1 xxxx xxxx 80 dec.25 21:10 q2
让我们将msg_max的上限值从10更改为256:

$cat/proc/sys/fs/mqueue/msg_max
10
$sudo sh-c“echo 256>/proc/sys/fs/mqueue/msg_max”
$cat/proc/sys/fs/mqueue/msg_max
256
现在可以创建最多包含256条消息的消息队列:

$。/mq/q3 11
$./mq/q4 256
$./mq/q5 257
mq_open:参数无效
$ls-la/dev/mqueue/
总数0
DRWXRWT 2根根140 dec.25 21:16。
drwxr-xr-x 20根根4600十二月25日20:51。。
-RWXR-x 1 xxxx xxxx 80十二月25日21:09 q0
-RWXR-x 1 xxxx xxxx 80十二月25日21:10第一季度
-RWXR-x 1 xxxx xxxx 80 dec.25 21:10 q2
-RWXR-x 1 xxxx xxxx 80十二月25日21:15第三季度
-RWXR-x 1 xxxx xxxx 80 dec.25 21:16 q4
但正如您所说,增加上限值需要超级用户权限。可以创建一个增加上限值的“setuid助手”。例如,以下程序设置作为参数传递的上限值:

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int-fd;
int rc;
int msg_max;
如果(argc!=2){
fprintf(stderr,“用法:%s\n”,argv[0]);
返回1;
}
fd=打开(“/proc/sys/fs/mqueue/msg_max”,O_RDWR);
如果(fd<0){
perror(“open()”);
返回1;
}
rc=写入(fd,argv[1],strlen(argv[1]);
if(rc!=strlen(argv[1])){
如果(rc>=0){
errno=EIO;
}
perror(“write()”);
返回1;
}
关闭(fd);
返回0;
}
我们可以构建它,将其所有者/组更改为root并添加setuid位:

$gcc mq\u helper.c-o mq\u helper
$sudo chown根mq\u助手
$sudo chgrp根mq\u助手
$sudo chmod 4555 mq_助手
$ls-l mq\u帮助程序
-r-sr-xr-x 1根根根17016十二月25日21:45 mq_
然后,可以从非超级用户帐户运行此程序,以更改msg_max的上限值:

$cat/proc/sys/fs/mqueue/msg_max
256
$./mq_-helper 98
$cat/proc/sys/fs/mqueue/msg_max
98

由于SYSV IPC被认为是不受欢迎的,所以用这些老式服务设计全新的应用程序是很遗憾的

POSIX消息队列基于文件系统。它通常安装在/dev/mqueue上:

$ls-la/dev/mqueue
总数0
DRWXRWT 2根根40十二月25日21:02。
drwxr-xr-x 20根根4600十二月25日20:51。。
使用创建消息队列。attr参数提供设置某些属性的功能:

struct mq\u attr{
长mq_标志;/*标志(对于mq_open()忽略)*/
队列上消息的长mq_maxmsg;/*最大值*/
长mq_msgsize;/*最大消息大小(字节)*/
长mq_凝乳;