在我的C++應用程序中,我需要運行幾個bash腳本。 (有時是常規系統調用,即「關閉」,「rm」)。 當使用「系統」調用時,它會分叉一個新進程。Linux - 有沒有辦法在不派生新進程的情況下調用系統調用(bash腳本)?
有沒有辦法在不分叉新過程的情況下調用「system」?
在我的C++應用程序中,我需要運行幾個bash腳本。 (有時是常規系統調用,即「關閉」,「rm」)。 當使用「系統」調用時,它會分叉一個新進程。Linux - 有沒有辦法在不派生新進程的情況下調用系統調用(bash腳本)?
有沒有辦法在不分叉新過程的情況下調用「system」?
不,因爲運行腳本意味着運行bash和/或其他可執行二進制文件的實例。
儘管大多數常規系統調用都有相應的C函數,但這當然不會分叉進程(例如的unlink())。
編輯:我知道exec*
功能,但如果OP想運行幾個命令,他們是沒用的,可能除了運行最後一個。
-1,明顯不正確(不承認execve()的存在,這肯定是調用關閉的合理選項,因爲你的過程不期望經歷相同的過程)。 – 2014-09-02 18:02:23
不容易。但是,如果你願意的複雜性添加到您的設置,你可以:
rm
,shutdown
,等會做(你會重新發明輪子,雖然)那麼你就不需要fork()
或致電exec
...但它是更好的只是一個新的進程,或者使用exec
- 我看到了做事情的不同沒有優勢這個情況。
呃?對於關機,可以簡單地execve(),因爲您不希望繼續運行。 – 2014-09-02 18:00:10
呃,實際上,在標準libc庫中有這些bash命令的類似物。 但是nevetherless如果你想嘗試...我想說如何利用漏洞? 我的意思是,在這種情況下,不會有系統調用(不包括漏洞利用)。
咦? 「沒有系統調用」與「沒有系統調用」是非常非常不同的事情......並且,很多漏洞通常需要系統調用。而且,根據定義,它們非常脆弱 - 無法運行生產代碼。 – 2014-09-02 20:52:48
'exec()'直接用正在調用的新進程替換你的進程。因此,它不(需要)分叉。 – 2014-09-02 17:59:42
...這就是說,這些是你的選擇 - 要麼你開始一個新的過程(使用叉子,克隆或類似的東西),要麼你有自己的過程用你正在運行的東西取代它自己,在這種情況下,它不再存在。 – 2014-09-02 18:01:50
爲什麼不分叉? – 2014-09-02 18:09:08