消息队列的系统限制

本文详细解析了消息队列作为SystemV IPC对象的一种,在进程间通信时所面临的三个核心限制:单条消息的最大长度、消息队列的最大容量以及最大消息队列数。通过具体示例程序,作者展示了如何在实际应用中遇到这些限制,并提供了相应的解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:冯老师,华清远见嵌入式学院讲师。

消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制。第一:议个消息的最大长度;第二:消息队列的最大容量;第三:最大消息队列数。

一、 一个消息的最大长度

示例程序如下:

        #include <stdio.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>
        #include <stdlib.h>
        #include <errno.h>
        #include <string.h>

        #define N 8192

        typedef struct
        {
                long mtype;
                char mtext[N];
        }MSG;

        int main()
        {
                key_t key;
                int msgid;
                MSG buf;

                if ((key = ftok(".", 5)) == -1)
                {
                        perror("ftok");
                        exit(-1);
                }

                if ((msgid = msgget(key, 0666 | IPC_CREAT)) == -1)
                {
                        perror("msgget");
                        exit(-1);
                }

                memset(&buf, 'a', sizeof(buf));
                buf.mtype = 100;

                if (-1 == msgsnd(msgid, &buf, N, 0))
                {
                        perror("msgsnd 1");
                        exit(-1);
                }

                printf("**\n");

                return 0;
        }

程序执行结果如下:

        linux@ubuntu:~/process/fifth$ ./a.out
        msgsnd 1: Invalid argument

当N为8192时,可以成功执行,打印出’**”,当改成N为8193时,就出现了上面的错误,因此,消息队列中,每个消息的正文的最大长度为8192.

二、 消息队列的最大容量

示例程序如下:

        #include <stdio.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>
        #include <stdlib.h>
        #include <errno.h>
        #include <string.h>

        #define N 8192

        typedef struct
        {
                long mtype;
                char mtext[N];
        }MSG;

        int main()
        {
                key_t key;
                int msgid;
                MSG buf;

                if ((key = ftok(".", 5)) == -1)
                {
                        perror("ftok");
                        exit(-1);
                }

                if ((msgid = msgget(key, 0666 | IPC_CREAT)) == -1)
                {
                        perror("msgget");
                        exit(-1);
                }

                memset(&buf, 'a', sizeof(buf));
                buf.mtype = 100;
                if (-1 == msgsnd(msgid, &buf, N, 0))
                {
                        perror("msgsnd 1");
                        exit(-1);
                }

                if (-1 == msgsnd(msgid, &buf, N, 0))
                {
                        perror("msgsnd 2");
                        exit(-1);
                }

                if (-1 == msgsnd(msgid, &buf, 1, 0))
                {
                        perror("msgsnd 3");
                        exit(-1);
                }

                return 0;
        }

程序执行结果如下:

        linux@ubuntu:~/process/fifth$ ipcs -q
        ------------------ Message Queues --------------------
        key                      msqid       owner       perms      used-bytes   messages
        0x0501451d     131076     linux          666           16384            2

可以看出,一个消息队列中的所有消息最多占16384字节。超过这个值后,发送函数msgsnd阻塞。

三、 最大消息队列数

示例程序如下:

        #include <stdio.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>
        #include <stdlib.h>
        #include <errno.h>
        #include <string.h>
        #include <strings.h>
        #define N 8192
        typedef struct
                {
                        long mtype;
                        char mtext[N];
                }MSG;

                int main()
                {
                        key_t key;
                        int msgid, i, n = 0;
                        MSG buf;

                        for (i = 1; ; i++)
                        {
                        if ((key = ftok(".", i)) == -1)
                        {
                                fprintf(stderr, "ftok i=%d--%s\n", i, strerror(errno));
                                //perror("ftok");
                                exit(-1);
                        }

                        if ((msgid = msgget(key, 0666 | IPC_CREAT | IPC_EXCL)) == -1)
                        {
                                if (errno == EEXIST)
                                break;
                                //fprintf(stderr, "msgget i=%d--%s\n", i, strerror(errno));
                                //perror("msgget");
                                exit(-1);
                        }
                        n++;

                }
                printf("n=%d msgid=%d\n", n, msgid);
                return 0;
        }

程序执行结果,n为256.

该程序说明了,最多可以创建256个消息队列。

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column716.htm

更多相关技术文章查看讲师博文>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值