[英]mq_open giving “too many open files”
我用以下代码创建了一个消息队列。 前几次它都可以正常工作。
int main()
{
mqd_t mqdes;
char mq_name[10] = "/mq";
int oflag = O_CREAT | O_RDWR, ret;
struct mq_attr attr;
attr.mq_maxmsg = 1024;
attr.mq_msgsize = 2048;
mqdes = mq_open(mq_name, oflag, 0766, &attr);
if(mqdes == -1) {
perror("mq_open");
if(errno == EMFILE)
perror("EMFILE");
exit(1);
}
printf("mqueue created, mq_descriptor: %d\n", mqdes);
ret = mq_close(mqdes);
if(ret == -1) {
perror("mq_close");
exit(2);
}
printf(" mq closed successful\n");
return 0;
}
之后,出现以下错误
mq_open: Too many open files
EMFILE: Too many open files
但是,为什么我会收到此错误? 我如何看到possix消息队列(如ipcs
)用于系统V?
我在尝试某些东西时遇到了同样的问题。 如果偶然在系统上留下了太多打开的消息队列,则可以尝试删除目录/dev/mqueue
。 这对我有用。
你也可能需要使用mq_unlink(const char *name)
后mq_close()
以确保所描述的队列从系统中删除这里 。
尝试设置资源限制:
#include <sys/resource.h>
struct rlimit rlim;
memset(&rlim, 0, sizeof(rlim));
rlim.rlim_cur = RLIM_INFINITY;
rlim.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_MSGQUEUE, &rlim);
我有同样的问题,我通过setrlimit增加RLIMIT_MSGQUEUE
来解决。
如果硬限制(rlim_max)也太低(对我来说就是这种情况),则必须为您的进程赋予CAP_SYS_RESOURCE
特权,以便您可以在设置进程限制(rlim_cur)之前设置硬限制。 通过可执行文件运行$ setcap 'CAP_SYS_RESOURCE=+ep' /path/to/executable
executable或编辑/etc/security/capability.conf
以将CAP_SYS_RESOURCE提供给用户/组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.