2016-01-07 161 views
2

我有一個C++程序,我想從中執行shell中的多個命令。 我目前的解決方案使用system()函數,看起來像這樣:C++在shell中執行許多命令

return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_1); 
... do_something_else ... 
return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_2); 
... do_something_else ... 
return_value = system(SETUP_ENVIRONMENT; RUN_USEFUL_APP_3); 
... 

它的工作原理,但SETUP_ENVIRONMENT需要幾秒鐘的製作程序很慢。但是我必須每次都運行它,因爲system()每次都在新的shell中運行。 我希望能夠安裝我的shell一次,然後運行其中的所有命令。

execute_in_shell(SETUP_ENVIRONMENT); 
return_value = execute_in_shell(RUN_USEFUL_APP_1); 
... do_something_else ... 
return_value = execute_in_shell(RUN_USEFUL_APP_2); 
... do_something_else ... 
return_value = execute_in_shell(RUN_USEFUL_APP_3); 
... 

我該怎麼做?

我在Linux上。

+1

您可以在管道中打開一個shell並通過它發送命令。 –

+1

http://stackoverflow.com/questions/245600/using-a-single-system-call-to-execute-multiple-commands-in-c – mstruebing

+1

@mstruebing:這假設你知道哪些程序運行,何時,以及哪些參數。管道是更好的解決方案。 – MSalters

回答

0

根據您的具體需要,您有三個合理的選擇來完成此操作。

如果您對外部工具進行的各種調用是一致性例程的一部分,那麼您可以 - 也可能應該 - 遵循@ dmi的建議並編寫一個簡短的shell腳本,您可以從C++程序中調用該腳本。

如果您不是需要在這裏和那裏啓動程序,你可能有興趣進入運行外殼作爲劣等過程和程序連接到它 - 這樣,而不是與你的終端進行交談,外殼工藝會談你的C++程序。

這種方法也不是很困難,但有幾個陷阱(例如,像SSH,須藤泊塢窗某些程序可能期望被安裝到TTY)。對於任何Unix變體,系統編程的大多數介紹(查找進程間通信和子進程)都有很好的介紹。讓我概括了程序:

  1. 使用管道系統調用創建管道(stdin_r,stdin_w)
  2. 使用管道系統調用創建管道(stdout_r,stdout_w)
  3. 使用管道系統調用創建管道(stderr_r,stderr_w)
  4. 使用系統調用fork複製程序
  5. 在孩子,你接近stdin_w,stdout_r,stderr_r,並使用 exec系統調用由stdin_r,stdout_w parametrised,stderr_w到 運行shell。
  6. 在父項中,關閉stdin_r,stdout_w,stderr_w,並且您現在可以在stdin_w中寫入命令,並從 stdout_r和stderr_r中讀取命令輸出。

(這個故意非常粗略,我只包括輪廓,以便您確定在您最喜愛的教科書中找到了正確的位置)。

有第三方庫爲您實現所有低級別的東西。您可以使用boost::process(現在還不是升級的官方部分),其用法用full tutorial來說明。有plenty of alternatives,如pstreams

第三個選擇是避免使用shell並執行直接使用的shell命令。這是Rashell之後的方法,它是一個OCaml庫,用於定義允許可靠組合子流程的基元,您可以使用它來獲取靈感。

1

除了回答1,您還可以使用您的程序創建一個shell腳本,它將運行所有有用的程序並立即執行此腳本。然後每個特定的有用程序都不會啓動shell。

+1

我不確定設置環境是什麼,但據我瞭解,大部分時間都是由它完全消耗的,對吧?也許你可以爲你的主進程設置所需的環境,然後所有派生的進程會自動繼承它,所以你不需要爲每個特定的有用程序進行設置?或者想一些其他方式來共享環境給他們(如果可能的話)(即通過文件或共享內存) – dmi