c - 在 FC 18 机器上,mq_open 失败,没有 EMFILE 错误

标签 c linux message-queue

我正在尝试打开一个新的消息队列,但由于打开文件过多 (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_max
256

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

$mkdir /dev/mqueue
$mount -t mqueue none /dev/mqueue
$ ls -l /dev/mqueue
total 0
$gcc -g -o mqueue mqueue.c -lrt
$./mqueue
Failed:24(Too many open files)
$ ls -l /dev/mqueue
total 0

就像 FC18 一样,我无法在运行内核版本 3.6.10 和 3.6.11 的 Linux 机器上创建消息队列。而同一个程序在 Linux 2.6.31 和 Linux 3.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) 设置软限制。 如果 hardlimit 对于您的目的来说太小,则需要 CAP_SYS_RESOURCE。

关于c - 在 FC 18 机器上,mq_open 失败,没有 EMFILE 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351044/

相关文章:

c - WinAPI 消息队列示例

c - 仅取消引用一次双指针?

c - 编写代码来查找坐标之间的平行线(使用 C)

linux - 如何使用 sed 捕获正在运行的 vm 目录?

linux - Py 2.7 架构 : How to persistent HTTP/S with multiple servers and not gather data to send multiple times?

rabbitmq - 对于低端设置,RabbitMQ有什么好的替代品吗?

c++ - ISO C++ 禁止在 devc++ 中比较指针和整数 [-fpermissive] 错误

c - TransmitFile 是否适用于管道?

php - 执行 ("touch");不在 PHP 中运行

c - mq_open errno 13 权限被拒绝