【问题标题】:Embedded linux child process creation problem嵌入式linux子进程创建问题
【发布时间】:2010-02-24 13:52:14
【问题描述】:

我在我的板上使用 linux 内核 2.6.30。 它有 128MB 的 DDR2。 我的主应用程序占用了将近 80MB 的系统内存。 执行所有应用程序后,只剩下 25MB。 我想从我的主应用程序(使用 80MB)执行系统命令。 但它没有被执行。据我了解,每个子进程都需要与父进程相同的内存(我从 fork 功能手册中得到了这个描述)。所以在我的情况下,新的子进程需要另外 80MB,这是不可用的。因此系统调用不起作用。 系统命令必须在给出命令后立即执行,因为主应用程序中的以下步骤需要系统命令的结果(例如需要将 grep 命令的输出存储在文件中并立即读取该文件以进行进一步处理)。因此我不能使用 IPC 机制。 还有哪些方法?

苏拉布·沙阿

【问题讨论】:

  • 对于遇到此问题的任何人。我也面临同样的问题,通过在 /etc/sysctl.conf 中设置 vm.overcommit_memory=1 临时修复

标签: linux process embedded


【解决方案1】:

除非你有一些奇怪的、损坏的 CPU 架构或 libc,否则它应该使用带有 fork() 的 Copy-on-Write,所以你应该可以在之后使用 exec()

【讨论】:

  • 也许 OP 已经关闭了 overcommit?
【解决方案2】:

如果您使用system(),则需要执行shell 来解析和执行您的命令,并且shell 可能很大。如果您可以自己将字符串拆分为命令和参数,那么您可以直接调用fork()execve(),这样就不需要加载shell。

【讨论】:

    【解决方案3】:

    您应该先尝试一个简单的分叉,然后看看会发生什么。我想我遇到了类似的问题,thttpd 服务器无缘无故地耗尽了内存。 strace 也是一个非常有用的工具。
    strace 您的进程,您将能够看到哪个系统调用失败,并在此处向人们提供更多信息。

    另外,我不明白为什么 IPC 不是解决方案。可能更复杂,但仍然是一个解决方案。 例如,您可以使用 unix 域套接字来获取双向管道。

    【讨论】:

      【解决方案4】:

      如果您的嵌入式系统安装了 glib,您可以尝试使用它们的等效系统调用。

      见: http://library.gnome.org/devel/glib/2.22/glib-Spawning-Processes.html

      g_spawn_sync 似乎可以满足您的需求。

      不幸的是,system() 调用通常很难从中获得好的错误代码。我认为值得尝试使用 fork() 和 exec() (就像其他海报建议的那样),看看它们是否会返回更详细的错误代码,以及它是否是 fork() 或 exec() (或其他东西else) 失败了。

      如果您能收集到这些额外信息,它可能会帮助其他人协助您进行调试。

      【讨论】:

        猜你喜欢
        • 2020-01-16
        • 2015-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多