我在Linux上開發的C代碼,我想執行一個二進制說/usr/sbin/binary_program -p xxx
,有沒有比system()
呼叫執行二進制的另一種方式?是否有另一種方法比系統()執行二進制
回答
是的,在一般情況下,system
不應該被使用,至少這些原因:
- 它從shell引用問題的種種危險遭遇,所以決不是一個硬編碼的命令行是潛在的危險。
- 它不是線程安全的。
- 它會干擾調用程序中的信號處理。
- 除非命令明確地將輸出保存到文件,否則它不提供從執行的程序獲取輸出的方式,除了退出狀態。
爲了執行外部程序,你應該使用posix_spawn
,或fork
隨後的exec
- 家庭功能之一。但是,如果可能的話,應該避免依賴外部程序/命令,特別是在程序中直接進行工作時更容易且不易出錯的情況下。例如,我已經看到了像system("sleep 1");
而不是sleep(1);
這樣荒謬的用法。
'system'的一個更有用的替換是'popen',但它仍然有一些相同的問題(如shell引用)。 –
是的,您可以使用exec*
功能家族。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html
如果需要模擬的system
行爲可以fork
然後調用exec
功能。
的POSIX的system
page說:
系統()函數應行爲,如果一個子進程使用fork()的創建和子進程使用execl的()如下調用SH工具:
execl(< shell path>,「sh」,「-c」,command,(char *)0);
請注意,'system'是通過'fork'-ing和'exec'後來'/ bin/sh -c'工作的,這也是標準化的。 –
認識到您可以同時運行多個程序並通過管道進行通信(或其他Inter Process Communication)很重要。這通常可能是通過系統調用的混合。
我強烈建議閱讀Advanced Linux Programming,或其他一些好書解釋了很多(比我們可以在幾分鐘內完成),對所涉及的各種syscalls(2),特別是fork(2),pipe(2),dup2(2),execve(2),waitpid(2)和其他幾個人(也許poll(2)用於多路複用,例如以避免環形管道中的死鎖)。該system(3)
功能這些系統調用(和/bin/sh
)
這高級Linux編程本書有專門處理一整章再建。
我還建議瞭解一個Unix命令shell是如何工作的。通過研究一些簡單的免費外殼的源代碼(如sash
)或者至少通過strace
來研究它。
實際上,popen(3)比system(3)更有用。您可以獲取伴侶命令的輸出。一些庫(Poco,Qt,Glib/GTK)也具有強大的過程管理功能。
一個新的過程是用fork
創建的,這是棘手的瞭解。在execve
的同一過程中啓動一個新程序。
所有進程fork
(或者vfork
)創造除了一些少數內核(/sbin/init
,/sbin/modprobe
,...)
- 1. 是否有另一種方法在java中執行repaint()?
- 2. 是否有另一種方法來啓動進程比child_process中的方法?
- 3. 如何在另一種方法之前強制執行一種方法?
- 4. 二維數組迭代方法比另一種方法更快
- 5. 如何僅在執行第一種方法後執行第二種方法
- 6. 是否有另一種同步方式
- 7. 是否有強制執行finalize()方法的方法
- 8. 確定將執行哪種方法(類型系統)
- 9. 是否有另一種方法來設置spring.data.rest.base-path比忽略的屬性?
- 10. 完成另一種方法後執行方法
- 11. 完成另一種方法後執行方法的問題 - iOS
- 12. 停止執行另一種方法的方法
- 13. 從Go執行第三方二進制
- 14. 從另一種方法運行方法
- 15. 找出是否有一種方法可以調用另一個方法
- 16. 無法執行二進制文件
- 17. cygwin - 無法執行二進制文件
- 18. 執行二進制搜索算法
- 19. bash,無法執行二進制文件
- 20. PhantomJs無法執行二進制文件
- 21. 無法執行二進制文件centos?
- 22. 是否有另一種方法來修復Yesod的nicHtmlField?
- 23. 另一種檢查圖像url的方法是否有效
- 24. 是否有另外一種方法來編寫if語句?
- 25. 是否有另一種在DataGridView中顯示數據的方法?
- 26. 是否有另一種刪除多個頭的方法?
- 27. 是否有另一種方法來驗證$ _POST數據?
- 28. 是否有另一種方法來設置DataGrid列對齊?
- 29. 是否有另一種方法來過濾網格視圖?
- 30. webassembly可能是一種強制執行drm的方法嗎?
你看看'system'手冊頁底部開始奇蹟般地查看「另請參閱」部分是否有任何內容? – Mat
你希望通過使用'system()'以外的東西解決哪些缺陷? –
如何使用dll共享對象並在運行時加載它? – 0x90