我正在尝试打开一个新的邮件队列,但它因太多打开的文件(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
共0 $ gcc -g -o mqueue mqueue.c -lrt
$。/ mqueue
失败:24(打开的文件太多)
$ ls -l / dev / mqueue
总共0
就像FC18一样,我无法在内核版本3.6.10和3.6.11上运行的Linux机箱上创建消息队列。虽然相同的程序在Linux 2.6.31和Linux 3.3.4上运行良好。
好像它在某处崩溃了。或者我在这里缺少什么?有什么帮助吗?!?谢谢!
答案 0 :(得分:2)
有点迟到的答案,但是:
如果打开的文件太多或者超出最大队列大小,则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。
答案 1 :(得分:0)
我看到的一个问题是,即使将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
或按照@ wr0112358设置rlimit以获得更永久的解决方案。