2014-09-02 52 views
1

在我的C++應用程序中,我需要運行幾個bash腳本。 (有時是常規系統調用,即「關閉」,「rm」)。 當使用「系統」調用時,它會分叉一個新進程。Linux - 有沒有辦法在不派生新進程的情況下調用系統調用(bash腳本)?

有沒有辦法在不分叉新過程的情況下調用「system」?

+2

'exec()'直接用正在調用的新進程替換你的進程。因此,它不(需要)分叉。 – 2014-09-02 17:59:42

+2

...這就是說,這些是你的選擇 - 要麼你開始一個新的過程(使用叉子,克隆或類似的東西),要麼你有自己的過程用你正在運行的東西取代它自己,在這種情況下,它不再存在。 – 2014-09-02 18:01:50

+3

爲什麼不分叉? – 2014-09-02 18:09:08

回答

0

不,因爲運行腳本意味着運行bash和/或其他可執行二進制文件的實例。

儘管大多數常規系統調用都有相應的C函數,但這當然不會分叉進程(例如的unlink())。

編輯:我知道exec*功能,但如果OP想運行幾個命令,他們是沒用的,可能除了運行最後一個。

+1

-1,明顯不正確(不承認execve()的存在,這肯定是調用關閉的合理選項,因爲你的過程不期望經歷相同的過程)。 – 2014-09-02 18:02:23

1

不容易。但是,如果你願意的複雜性添加到您的設置,你可以:

  1. 使你的程序本身做了系統調用rmshutdown,等會做(你會重新發明輪子,雖然)
  2. 編寫一個腳本,用於偵聽端口上給出的命令,並執行命令(並保持腳本運行 - 可能是一個守護進程)。複雜和脆弱...

那麼你就不需要fork()或致電exec ...但它是更好的只是一個新的進程,或者使用exec - 我看到了做事情的不同沒有優勢這個情況。

+3

呃?對於關機,可以簡單地execve(),因爲您不希望繼續運行。 – 2014-09-02 18:00:10

0

呃,實際上,在標準libc庫中有這些bash命令的類似物。 但是nevetherless如果你想嘗試...我想說如何利用漏洞? 我的意思是,在這種情況下,不會有系統調用(不包括漏洞利用)。

+0

咦? 「沒有系統調用」與「沒有系統調用」是非常非常不同的事情......並且,很多漏洞通常需要系統調用。而且,根據定義,它們非常脆弱 - 無法運行生產代碼。 – 2014-09-02 20:52:48

相關問題