2013-08-06 49 views
1

我在Linux上開發的C代碼,我想執行一個二進制說/usr/sbin/binary_program -p xxx,有沒有比system()呼叫執行二進制的另一種方式?是否有另一種方法比系統()執行二進制

+2

你看看'system'手冊頁底部開始奇蹟般地查看「另請參閱」部分是否有任何內容? – Mat

+1

你希望通過使用'system()'以外的東西解決哪些缺陷? –

+0

如何使用dll共享對象並在運行時加載它? – 0x90

回答

5

是的,在一般情況下,system不應該被使用,至少這些原因:

  • 它從shell引用問題的種種危險遭遇,所以決不是一個硬編碼的命令行是潛在的危險。
  • 它不是線程安全的。
  • 它會干擾調用程序中的信號處理。
  • 除非命令明確地將輸出保存到文件,否則它不提供從執行的程序獲取輸出的方式,除了退出狀態。

爲了執行外部程序,你應該使用posix_spawn,或fork隨後的exec - 家庭功能之一。但是,如果可能的話,應該避免依賴外部程序/命令,特別是在程序中直接進行工作時更容易且不易出錯的情況下。例如,我已經看到了像system("sleep 1");而不是sleep(1);這樣荒謬的用法。

+0

'system'的一個更有用的替換是'popen',但它仍然有一些相同的問題(如shell引用)。 –

3

是的,您可以使用exec*功能家族。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html

如果需要模擬的system行爲可以fork然後調用exec功能。

的POSIX的systempage說:

系統()函數應行爲,如果一個子進程使用fork()的創建和子進程使用execl的()如下調用SH工具:

execl(< shell path>,「sh」,「-c」,command,(char *)0);

+0

請注意,'system'是通過'fork'-ing和'exec'後來'/ bin/sh -c'工作的,這也是標準化的。 –

2

認識到您可以同時運行多個程序並通過管道進行通信(或其他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,...)

相關問題