我試圖運行C中的應用_without_,但我能找到的唯一途徑是相當容易使用的作品是這樣的:內的C運行程序使用shell
system("command here");
它工作的,當然,但它真的很慢(特別是當重複這一點)。我只是想知道是否有一種運行程序而沒有必須與shell交互的方式,如python's subprocess module。
我聽說過execl
,我會用它(當然是第一個),但我想知道是否有一種更簡單的方法,不需要先分叉。
編輯:我也希望能夠知道程序
我試圖運行C中的應用_without_,但我能找到的唯一途徑是相當容易使用的作品是這樣的:內的C運行程序使用shell
system("command here");
它工作的,當然,但它真的很慢(特別是當重複這一點)。我只是想知道是否有一種運行程序而沒有必須與shell交互的方式,如python's subprocess module。
我聽說過execl
,我會用它(當然是第一個),但我想知道是否有一種更簡單的方法,不需要先分叉。
編輯:我也希望能夠知道程序
如果沒有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信號(當孩子死亡時會通知您)。
的返回碼作爲我敢肯定,你已經知道,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
來獲取進程的退出狀態。
'vfork()'很奇怪;準確使用的規則非常嚴格;很容易弄錯。 –
@JonathanLeffler確實。希望我對OP做的足夠清楚,以便他們可以更仔細地衡量他們的選擇。 –
構建於C上的Python將會包裝該功能。所有你需要做的就是將你自己的函數定義爲fork和exec,然後在你需要的地方使用它。 – Dave
@Dave,當然可以,但是我怎麼知道程序的返回碼? – MiJyn
你可以用'waitpid'(如果你想異步,用'WNOHANG'),一旦它關閉就會給你退出狀態。 – Dave