我在我的主板上使用linux内核2.6.30。 它有128MB的DDR2。 我的主要应用程序占用了近80MB的系统内存。 执行所有应用程序后,只剩下25MB。 我想从我的主应用程序(使用80MB)执行系统命令。 但它没有被执行。根据我的理解,每个子进程需要与父进程相同的内存(我从fork函数手册中获得了这个描述)。所以在我的情况下,新的子进程需要另外80MB,这是不可用的。因此系统调用不起作用。 系统命令必须在发出命令后立即执行,因为主应用程序中的步骤需要系统命令的结果(比如需要将grep命令的输出存储在文件中并立即读取该文件以供进一步处理)。因此我不能使用IPC机制。 还有什么其他方法?
Saurabh Shah
答案 0 :(得分:1)
除非你有一些奇怪的,破坏的CPU架构或libc,否则它应该使用fork()
的写时复制,所以你应该可以使用exec()
。
答案 1 :(得分:1)
如果您正在使用system()
,那么它将需要执行shell来解析并执行您的命令,并且shell可能很大。如果你可以自己将字符串分成命令和参数,那么你可以直接调用fork()
和execve()
,这样就不需要加载shell了。
答案 2 :(得分:0)
如果您的嵌入式系统有可能安装了glib,您可以尝试使用他们的系统调用等价物。
请参阅: http://library.gnome.org/devel/glib/2.22/glib-Spawning-Processes.html
g_spawn_sync尤其可以满足您的需求。
不幸的是,system()调用通常很难从中获得好的错误代码。我认为值得尝试fork()和exec()(就像其他建议的海报一样),看看他们是否会返回更详细的错误代码,以及它是否是fork()或exec()(或者其他东西)否则,这是失败的。
如果您可以收集其他信息,可能会帮助其他人协助您进行调试。
答案 3 :(得分:0)
你应该先尝试一个简单的fork,看看会发生什么。我想我遇到了类似的问题,thttpd服务器没有任何理由耗尽内存。也是一个非常有用的工具,是strace 过滤你的过程,你将能够看到什么系统调用失败,并在这里向人们提供更多的信息。
另外,我不明白为什么IPC不是解决方案。可能更复杂,但仍然是一个解决方案。 例如,您可以使用unix域套接字来获取双向管道。