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