2010-02-11 27 views
3

我在我的主板上使用了linux內核2.6.30。 它有128MB的DDR2。 我的主應用程序佔用了近80MB的系統內存。 執行完所有應用程序後,只剩下25MB。 我想從我的主應用程序(使用80MB)執行系統命令。 但它沒有執行。根據我的理解,每個子進程都需要與父進程相同的內存(我從fork函數手冊中獲得了這個描述)。所以在我的情況下,新的子進程需要另外80MB不可用。因此係統調用不起作用。 系統命令在執行命令後必須立即執行,主要應用程序中的步驟需要系統命令的結果(例如需要將grep命令的輸出存儲在文件中並立即讀取該文件以供進一步處理)。因此我不能使用IPC機制。 什麼是其他方式?嵌入式linux兒童進程創建問題

SAURABH沙阿

回答

1

除非你有一些奇怪的,破碎的CPU架構或libc中應該使用寫入時複製與fork(),所以你應該罰款之後的exec()

+1

也許OP已關閉overcommit? – ephemient 2010-02-11 15:07:00

1

如果您使用的是system(),那麼它將需要執行shell來解析並執行您的命令,並且shell可能很大。如果您可以將字符串分成一個命令並自行參數,那麼您可以直接調用fork()execve(),以便不需要加載該shell。

0

如果您的嵌入式系統有機會安裝glib,您可以嘗試使用它們的系統調用等效項。

請參見: http://library.gnome.org/devel/glib/2.22/glib-Spawning-Processes.html

g_spawn_sync特別似乎做你所需要的。

不幸的是,系統()調用通常很難從中獲得良好的錯誤代碼。我認爲這將是值得嘗試一個fork()和exec()(像其他海報建議),看看他們是否會返回一個更詳細的錯誤代碼,以及它是否是fork()或exec()(或某物其他)失敗。

如果您可以收集其他信息,它可能有助於他人協助您的調試。

0

你應該先嚐試一個簡單的叉子,看看會發生什麼。我想我遇到了類似的問題,thttpd服務器沒有任何理由耗盡內存。也是一個非常有用的工具,是strace。
對您的過程進行了調整,您將能夠看到系統調用失敗,並向此處的人員提供更多信息。

此外,我不明白爲什麼IPC不是一個解決方案。可能會更復雜,但仍然是一個解決方案。 例如,您可以使用unix域套接字來獲取雙向管道。