我试图打开一个新的消息队列,但它失败了,打开的文件太多(24)错误。
这是我的示例代码:

#define ALERT_Q_NAME "/alert_q_test"

mqd_t mqdes;

int main()
{
    struct mq_attr attr;

    attr.mq_flags = 0;
    attr.mq_maxmsg = 512;
    attr.mq_msgsize = 1536;

    mqdes = mq_open(ALERT_Q_NAME, O_RDONLY | O_CREAT, 0600, &attr);
    if(mqdes == (mqd_t) -1)
    {
            printf("Failed:%d(%s)\n",errno,strerror(errno));
            exit(-1);
    }
    else
    {
            printf("Passed\n");
            mq_close(mqdes);
    }
    return 0;
}

系统范围内可创建的消息队列数限制为:
$cat/proc/sys/fs/mqueue/queues最大值
二百五十六
我确信没有达到这个系统限制,因为我正在一个新安装的FC18盒子上运行这个示例代码。为了确认这一点,我安装了消息队列文件系统:
$mkdir/dev/mqueue
$mount-t mqueue无/dev/mqueue
$ls-l/dev/mqueue
总计0
$g c c-g-o mqueue mqueue.c-lrt
美元/mqueue
失败:24(打开的文件太多)
$ls-l/dev/mqueue
总计0
像FC18一样,我无法在运行内核版本3.6.10和3.6.11的Linux机器上创建消息队列。同样的程序在Linux2.6.31和Linux3.3.4上运行良好。
好像在什么地方坏了。或者我在这里遗漏了什么?有什么帮助吗?!? 谢谢!!

最佳答案

回答有点晚,但是:
如果打开的文件太多或超出了最大mqueue大小,则mq_open可能会失败,并返回errno=EMFILE。
有关大小计算的详细信息,请参见setrlimit(2)中的RLIMIT_MSGQUEUE。
要获取当前软/硬限制:

grep -E 'Limit|queue' /proc/self/limits

要永久更改限制,请编辑/etc/security/limits.conf并使用“su-”再次登录用户。
/etc/security/limits.conf文件:
[user] hard msgqueue unlimited
[user] soft msgqueue unlimited

另一种可能性是使用setrlimt(2)/prlimit(2)设置softlimit。
如果出于您的目的,硬限制是小的,则需要CAP_SYS_RESOURCE。

10-06 02:05