Qt 上的“GLib-ERROR **:无法创建管道主循环唤醒:打开的文件太多”
Posted
技术标签:
【中文标题】Qt 上的“GLib-ERROR **:无法创建管道主循环唤醒:打开的文件太多”【英文标题】:"GLib-ERROR **: Cannot create pipe main loop wake-up: Too many open files" on Qt 【发布时间】:2013-07-31 22:40:08 【问题描述】:我正在开发 Ubuntu。当我大约在 1 小时后运行我的程序时,我收到了这个错误:
GLib-ERROR **: Cannot create pipe main loop wake-up: Too many open files 程序意外结束。
当我使用 gdb 运行时,它不会崩溃。
我不明白为什么?这个错误的原因是什么?
非常感谢..
【问题讨论】:
解决方案在这里:***.com/questions/17038133/… 【参考方案1】:打开的文件太多
很明显。可能你的文件描述符有泄漏,所以你应该检查你的代码是否打开了很多文件/文件描述符但没有正确关闭它们。如果你 fork 一个进程,你还应该考虑在开始实际进程之前关闭它们,因为这也可能是一个常见的错误。
操作系统有一个有限的表,它可以维护多少个文件描述符,显然你超出了这个限制。
【讨论】:
我在我的项目中使用 QAccessNetworkManager。这里的“文件描述符”是什么?? 错误来自操作系统,即使 iof 文件隐藏在类中的某个位置,您仍然必须确保它们已正确关闭。由于您没有提供任何示例代码,因此很难说您做错了什么。 在 linux 上,一切都是文件。你可以看看使用了哪些打开的文件:lsof
。可能会给你一个很长的清单。您可以通过以下方式过滤:lsof -i
用于套接字连接,lsof -f
用于真实文件流,...
抱歉,我现在明白你的意思了.. 我该怎么办?或者我的项目有什么错误?因为我用 Valgrind 分析过。肯定丢失了大约 30 MB .. 它有什么相关性吗?
30MB 听起来像是一个开始。 :) 我很确定这些类有适当的代码来关闭文件,如果他们保留一些,但如果你不删除它们,这不会发生。所以我会接受 valgrind 告诉你的。以上是关于Qt 上的“GLib-ERROR **:无法创建管道主循环唤醒:打开的文件太多”的主要内容,如果未能解决你的问题,请参考以下文章
LXSession 上的 Qt4 WindowsStayOnTop
蓝牙与 Android 上的 Qt。通过抽象类上的jni调用java类