gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:36 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com