2017-07-18 143 views
-2

我想在同一時間在ubuntu上使用C++代碼運行多個命令。 我用system()調用來運行多個命令,但system()調用的問題是它一次只調用一個命令,而rest命令正在等待。下面的 我寫了我的示例代碼,這可以幫助你獲得我想要做的。主要的事情是我想一次運行所有這些命令不是一個一個。請幫幫我。如何在linux中同時運行多個shell命令

在此先感謝。

main() 
{ 
    string command[3]; 
    command[0]= "ls -l"; 
    command[1]="ls"; 
    command[2]="cat main.cpp"; 

    for(int i=0;i<3;i++){ 
     system(command[i].c_str()); 
    } 
} 
+2

在任何書籍/ etc你正在UNIX上學習C++,找到'fork()'部分。 – slim

+0

(更具體地說,在'fork()'和'exec()'以及一般的進程管理。 – slim

+1

你可以使用'int main(){return 0;}'你不檢查'system'的返回值所以你不在乎你的命令運行是否成功,也可能不運行它們。 –

回答

-1

你有幾個選項(總是):

  • 使用線程(C++標準庫的實現是好的)來派生多個線程,每個執行系統調用然後終止。線程列表上的join等待它們全部終止。
  • 使用* NIX fork命令產生一個新進程,然後在每個子進程內使用exec執行所需的命令(請參閱here中的「將正確字符串送到正確的子進程」示例)。父進程可以使用waitpid來確定所有孩子何時完成了跑步,以便繼續進行該計劃。
  • 將「&」附加到您的每個命令中,這會告訴shell在後臺運行每個命令(具體來說,system將在後臺啓動進程,然後返回,而不等待結果)。沒有試過這個,不知道它是否會起作用。你不能再等待電話終止,但(謝謝PSkocik)。

只是指出 - 如果你同時運行這3個特定的命令,你不可能讀取輸出,因爲它們都將文本同時打印到終端。

如果您確實需要讀取程序內的輸出(雖然未在您的問題中提及),但this是相關的(儘管它不使用system)。

+2

最後一項是false。system(「&");'將異步創建孫子並返回。你通常不能'等待'對大孩子來說。 – PSkocik

+4

我的意見是'fork'&'waitpid'是最適合的解決方案,而不是線程。 –

+0

@PSkocik哦,不知道 - 我會更新回答。 – hnefatl

2

您應該閱讀Advanced Linux Programming(有點舊,但免費)。你可能想(在傳統的方式,最喜歡的貝殼做的):

  • 或許趕上SIGCHLDfork之前設置的信號處理程序,看到signal(7) & signal-safety(7) ...)

  • 通話fork(2)創造一個新的過程。一定要檢查所有three病例(失敗返回pid_t,孩子與pid_t,父母積極pid_t)。如果要與該進程進行通信,請使用pipe(2)(讀取約pipe(7) ...)之前fork

  • 在子進程中,關閉一些無用的文件描述符,然後運行一些exec函數(或底層的execve(2))來運行所需的程序(例如,/bin/ls

  • 調用(父,也許後已經得到了一個SIGCHLDwait(2)waitpid(2)或相關的功能。

這是非常平常的。 Advanced Linux Programming的幾個章節正在更好地解釋它。

有沒有必要在你的情況下使用線程。

但是,請注意的lscat的作用可以與不同的系統調用(在syscalls(2) ...列出)來完成,特別是read(2) & stat(2)。你可能甚至不需要運行其他進程。另請參見opendir(3) & readdir(3)

也許(尤其是如果你有幾個過程溝通直通幾個pipe(7) -s),你可能想使用poll(2)(或稱老select(2))一些event loop。一些庫提供了一個事件循環(特別是所有GUI小部件庫)。