2013-03-30 77 views
0

我試圖運行C中的應用_without_,但我能找到的唯一途徑是相當容易使用的作品是這樣的:內的C運行程序使用shell

system("command here"); 

它工作的,當然,但它真的很慢(特別是當重複這一點)。我只是想知道是否有一種運行程序而沒有必須與shell交互的方式,如python's subprocess module

我聽說過execl,我會用它(當然是第一個),但我想知道是否有一種更簡單的方法,不需要先分叉。

編輯:我也希望能夠知道程序

+0

構建於C上的Python將會包裝該功能。所有你需要做的就是將你自己的函數定義爲fork和exec,然後在你需要的地方使用它。 – Dave

+0

@Dave,當然可以,但是我怎麼知道程序的返回碼? – MiJyn

+0

你可以用'waitpid'(如果你想異步,用'WNOHANG'),一旦它關閉就會給你退出狀態。 – Dave

回答

1

如果沒有system()也不popen()提供你所需要的機制,那麼容易的方式來做到這一點是與fork()execv()(或者,也許,execl(),但參數列表必須固定在編譯時,不變量,使用它)。真! fork()exec()並不難,任何替代方法都會封裝這個處理。

Python子流程模塊僅僅爲您隱藏了fork()exec()便利的界面。這可能適用於像Python這樣的高級語言。 C是一種低級語言,並不需要複雜性。

難以實現的方法是使用posix_spawn()。您必須創建參數來描述您想要在fork()exec()之間完成的所有操作,這些操作遠不如設置fork(),進行更改並最終使用exec()更難設置。這個(posix_spawn())是你在設計代碼的時候得到的,它可以在沒有明顯使用fork()exec()的情況下產生子進程,並確保它幾乎可以處理任何合理的情況。

您需要考慮是否需要使用wait()waitpid()或變體來確定孩子何時完成。您可能需要考慮是否處理SIGCHLD信號(當孩子死亡時會通知您)。

2

的返回碼作爲我敢肯定,你已經知道,system已經採用了fork/exec策略。我知道你想繞過殼,並尋找一個簡單的方法,我只是說你可以輕鬆地寫一個函數來包裝fork/exec模式,如在system中所做的那樣。確實,這可能是最簡單的做法。 Gabe在評論中提到的替代方案是posix_spawn

一個更快(但顯然不鼓勵)的替代方案是vfork()/exec,但這通常是不鼓勵的,並且在最新的POSIX標準中已經過時。

4.3BSD; POSIX.1-2001(但標記爲OBSOLETE)。 POSIX.1-2008刪除了vfork()的 規範。

它的意思是立即後跟exec_exit。否則會出現各種奇怪的錯誤,因爲虛擬內存頁面和頁面表不重複(子項使用相同的數據/堆/堆棧段)。父母/致電過程會阻止,直到兒童exec s或_exit s。常規的fork的現代實現具有接近寫入時的語義,其接近vfork的速度,沒有由vfork的存儲器共享語義產生的潛在錯誤。

如果您想對內存共享語義和工藝傳承甚至進一步控制,以及隨之而來的潛在加速(並且是在Linux上),看看clone()(包裝進行系統調用sys_clone())這就是一些進程創建系統調用委託他們的工作。一定要仔細梳理所有的各種標誌。

您可以使用waitpid來獲取進程的退出狀態。

+0

'vfork()'很奇怪;準確使用的規則非常嚴格;很容易弄錯。 –

+0

@JonathanLeffler確實。希望我對OP做的足夠清楚,以便他們可以更仔細地衡量他們的選擇。 –