C语言 在fc18机器上mq_open失败,错误是没有EMFILE



我正在尝试打开一个新的消息队列,但由于打开的文件太多(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("Passedn");
            mq_close(mqdes);
    }
    return 0;
}

可以创建的消息队列的系统范围限制为:

猫/proc/sys/fs/mqueue/queues_max美元
256

我确信这个系统限制没有达到,因为我在新安装的FC18盒子上运行这个示例代码。为了确认这一点,我挂载了消息队列文件系统:

$mkdir/dev/mqueue
/dev/mqueue
$ ls -l/dev/mqueue
合计0
$gcc -g -o mqueue.c -lrt
美元。/mqueue
失败:24(打开的文件太多)
$ ls -l/dev/mqueue

就像FC18一样,我无法在内核版本3.6.10和3.6.11上运行的Linux盒子上创建消息队列。同样的程序在Linux 2.6.31和Linux 3.3.4上运行良好。

好像是什么地方坏了。或者我遗漏了什么?请帮忙?!?谢谢! !

有点迟了,但是:

mq_open可能会因为errno=EMFILE而失败,如果打开的文件太多或者超过了最大mqueue大小。

请参阅setrlimit(2)中的RLIMIT_MSGQUEUE,了解更多关于大小计算的信息。

获取当前软/硬限制:

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

要永久更改限制,请编辑/etc/security/limits.conf并使用'su - '再次登录用户。

/etc/安全/limits.conf:

[user] hard msgqueue unlimited
[user] soft msgqueue unlimited

另一种可能是使用setrlimit (2)/prlimit(2)设置软限制。如果硬限制对于您的目的来说太小,则需要CAP_SYS_RESOURCE。

我看到的一个问题是,即使我们将attr设置为NULL,默认值对于上面讨论的每个进程限制@wr0112358来说也太大了。

所以我们可以在

中找到的整个系统范围内
# cat /proc/sys/fs/mqueue/msg_max
128
# cat /proc/sys/fs/mqueue/msgsize_max
65536

,同时超出了每个进程的限制。

# ulimit -a |grep queue
POSIX message queues     (bytes, -q) 819200

一个可以用来检查的快速解决方案是增加ulimit:

# ulimit -q unlimited

或设置rlimit,如@wr0112358所示,以获得更持久的解决方案

最新更新