C++ Linux Posix队列中打开的文件太多

C++ Linux Posix队列中打开的文件太多,c++,linux,posix,C++,Linux,Posix,在我的应用程序中,我有不同的模块,它们通过posix队列进行通信,问题是当限制满足时,我会收到上面提到的错误,我在这两个模块中都设置了限制 sysctl fs.file-max = new_value 及 但这是一些硬编码的值,有没有克服这一点的最佳实践?我尝试通过mq\u close关闭描述符,但应用程序中的所有模块都可以随时使用任何消息。因此,我无法关闭所有描述符 linux/UNIX软限制和硬限制中有两种类型的资源限制。您可以设置的最大描述符已达到硬限制。有一些方法可以提高硬限制,但坦

在我的应用程序中,我有不同的模块,它们通过posix队列进行通信,问题是当限制满足时,我会收到上面提到的错误,我在这两个模块中都设置了限制

sysctl fs.file-max = new_value 


但这是一些硬编码的值,有没有克服这一点的最佳实践?我尝试通过
mq\u close
关闭描述符,但应用程序中的所有模块都可以随时使用任何消息。因此,我无法关闭所有描述符

linux/UNIX软限制和硬限制中有两种类型的资源限制。您可以设置的最大描述符已达到硬限制。有一些方法可以提高硬限制,但坦率地说,我从未尝试过这样做&出于两个原因,我也不建议这样做:

  • 同时打开太多描述符会降低程序的性能
  • 它甚至不需要增加硬限制,因为如果您在程序中正确关闭未使用的描述符,您将发现它甚至不是必需的。假设一个web服务器为每个新请求打开一个新描述符,也不需要增加硬限制

  • 最后,我建议您甚至增加软限制,请从您的程序中使用setrlimit函数,因为增加shell上的限制是临时的&如果您在profile中设置它,它将增加所有程序的限制

    您可能没有达到文件描述符总数的限制,而是达到了消息队列数量的限制,这种情况也会返回ENFILE。前几天你问了一个问题。您是否增加了允许的MQs数量?是的,我按照建议做了,但仍然得到了错误,我正在寻找解决方法。目前,我正在制作和处理程序,它将保留所有队列描述符,并仅在需要时打开。但这不是一个好方法,对吗?(1)你采取了哪些步骤?(2) 目前的限制是什么?(3) 您的应用程序/系统使用了多少个队列?如果没有人帮忙,我明天会去接的。你打开了还是打开了很多文件?open有一个限制,比如254,但是open的限制要高得多。如果队列实现使用open,可能会遇到这种情况。
    ulimit -n