- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 GLib 的问题。我想在服务器上下文中使用 GLib,但我不知道内存是如何管理的: https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html
If any call to allocate memory fails, the application is terminated. This also means that there is no need to check if the call succeeded.
如果我查看源代码,如果 g_malloc 失败,它将调用 g_error:
g_error()
define g_error(...)
A convenience function/macro to log an error message.Error messages are always fatal, resulting in a call to abort() to terminate the application.[...]
但就我而言,当我正在开发服务器应用程序时,我不希望应用程序退出,我更愿意像传统的 malloc 函数一样,GLib 函数返回 NULL 或其他指示发生错误的东西。
所以,我的问题是,有没有办法处理内存不足?是否不建议将 GLib 用于服务器用途的应用程序?
如果我查看 abort 的人,我可以看到我可以处理信号,但我会使内存不足错误的管理有点痛苦......
The abort() function causes abnormal program termination to occur, unlessthe signal SIGABRT is being caught and the signal handler does notreturn.
谢谢你的帮助!
最佳答案
从内存力不足中恢复是非常困难的。原因是它可以被认为是一种终结状态,在某种意义上,内存缺失会持续一段时间,然后才会消失。即使对内存不足使用react(如通知用户)也可能需要更多内存,例如,构建和发送消息。一个相关的问题是有些操作系统(至少是 linux)可能对分配内存过于乐观。当内核意识到内存丢失时,它可能会终止应用程序,即使您的代码正在处理故障也是如此。
因此,要么你对整个系统的掌握比一般人更严格,要么你将无法成功处理内存不足错误,而且在这种情况下,帮助程序库在做什么并不重要.
如果你真的想在仍然使用 glib 的同时控制内存分配,你有部分方法可以做到这一点。不要使用任何 glib 分配函数并使用其他库中的一些。 Glib 提供在必要时接收“自由函数”的函数。例如:
https://developer.gnome.org/glib/2.31/glib-Hash-Tables.html#g-hash-table-new-full
哈希表构造函数接受用于销毁键和值的函数。在您的情况下,数据将使用自定义分配函数进行分配,而哈希数据结构将使用 glib 函数进行分配。
或者,您可以使用 g_try_* 宏来分配内存,这样您仍然可以使用 glib 分配器,但它不会因错误而中止。同样,这只能部分解决问题。在内部,glib 将隐式调用可能会中止的函数,并且假定它永远不会返回错误。
关于一般性问题:服务器在内存不足时崩溃是否有意义?显而易见的答案是否定的,但我无法估计这个答案的理论性。我只能期望服务器系统的大小适合其运行,并拒绝任何可能超出其容量的输入,因为它无效,为此,它可能使用哪些库并不重要。
关于c - GLib 句柄内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974254/
我想在 GLib 中将整数值转换为字符串。是否有任何宏或函数?或者我可以在同一个双向链表中存储不同的数据类型吗? 最佳答案 gchar *my_string = g_strdup_printf("%i
所以基本上我正在编写以下步骤来创建基于 dbus 的应用程序。1. g_bus_watch_name(特定服务出现的回调)2. g_signal_connect 附加到服务提供的某些信号。 g_sig
所以基本上我正在编写以下步骤来创建基于 dbus 的应用程序。1. g_bus_watch_name(特定服务出现的回调)2. g_signal_connect 附加到服务提供的某些信号。 g_sig
我尝试使用JUCE框架构建cpp程序,但出现错误 make: *** No rule to make target '/usr/include/glib-2.0/glib/gurifuncs.h',
我有一些使用 dbus-glib 通过 dbus 编写服务器导出和接口(interface)。 我正在尝试编写一个将字节数组作为输入的方法,但是我很难确定在我的方法参数中使用什么类型。 例如,如果我有
我一直在研究 python-mpdor 的源代码它提到它是 gobject-based, for easy event handling (in the high-level client class
假设我有一个 GLib.Array并想将其转换为 Item[] ,我将如何在 Vala 中做到这一点? 最佳答案 首先,除非您需要与现有代码进行互操作,否则不要使用 GLib.Array。使用 GLi
我正在尝试使用 GLib 的 spawn_command_line_sync 将 echo 的输出通过管道传输到命令中方法。我遇到的问题是 echo 将整个命令解释为参数。 为了更好地解释,我在我的代
我似乎无法使用 glib.h 编译这个基本程序... #include glib.h #include stdio.h int main () { return ((glib_major_ver
我刚开始学习 vala。我尝试了来自 vala tutorial 的以下程序. class Demo.Hello : Glib.Object { public static int main( s
在调查一些性能问题时,我最终进入了 gthread-posix.c。 在那里我找到了如下代码: static void __attribute__((noinline)) g_mutex_lock_s
这个问题在这里已经有了答案: Undefined reference to 'pthread_create' — linker command option order (libraries bef
我正在学习使用 GLib 编写简单、高效的套接字服务器的基础知识。我正在试验 GSocketService。到目前为止,我似乎只能接受连接,但它们会立即关闭。从文档中我无法弄清楚我缺少的步骤。我希望有
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
我尝试了sudo apt-get install libglib2.0-dev并得到了 libglib2.0-dev is already the newest version. 我仍然收到错误 co
所以我正在尝试使用 GtkSourceViewmm 在 C++ 中使用 GtkSourceView ,其文档和支持水平给我的印象是很长一段时间没有仔细研究它。但我始终是一个乐观主义者 :) 我正在尝试
我是编程新手。我正在创建一个 Qt GUI 应用程序。这是一个小的拼字游戏。问题是每当我在构建它后从命令提示符启动这个程序时,我都会在命令提示符下得到以下输出: JumbleGame 1.0 Laun
我正在尝试创建一个相当简单的使用自动工具的 BitBake 配方,您可以在这里看到: SUMMARY = "an example autotools recipe" LICENSE = "MIT" L
我正在尝试创建一个相当简单的使用自动工具的 BitBake 配方,您可以在这里看到: SUMMARY = "an example autotools recipe" LICENSE = "MIT" L
我正在查看一段代码,它直到最近才有效。基本上,我有一个 C++ 类,我在其中使用 G_LOCK_DEFINE 宏保护一个变量。 class CSomeClass { private: gulo
我是一名优秀的程序员,十分优秀!