我有一個程序需要運行一個程序,我們將在我們的linux(CentOS)集羣上並行調用externalProg - 或者說,它需要運行多個externalProg實例,核心。每個「線程」根據幾個參數創建3個文件 - externalProg的輸入,一個告訴externalProg如何執行我的文件的命令文件,以及一個用於設置環境的bash腳本(調用製造商提供的設置腳本)以及實際上用我的輸入調用externalProg。C++執行臨時文件作爲bash腳本
因爲這需要與未知數量的併發線程並行,我不想冒險覆蓋另一個線程的文件,我使用
mkstemp("PREFIX_XXXXXX")
這些輸入文件創建的臨時文件。外部程序運行後,我提取相關數據並存儲它,並關閉臨時文件(因此刪除它們)。
我們稱之爲創建的文件(實際上有一個基於上述模板的名稱)
tmpInputs - Inputs to externalProg
tmpCommand - Input that tells externalProg how to execute tmpInputs
tmpBash - bash script to set up and call externalProg with my inputs
文件tmpBash看起來像
source /path/to/setup/script # Sets up environment variables
externalProg < /path/to/tmpCommand
其中tmpCommand只是一個簡單的文本文件。
我遇到的問題實際上是執行bash腳本。在我的程序中,我打電話
ostringstream launchcmd;
launchcmd << "bash " << path_to_tmpBash
system(launchcmd.str().c_str());
但沒有任何反應。沒有錯誤,沒有警告,沒有'找不到文件'或權限被拒絕或任何東西。我已經驗證過這些文件正在創建並且具有正確的內容。 system()之後的其餘代碼被成功執行(儘管由於externalProg未運行而失敗)。
奇怪的是,如果我回到終端輸入
bash /path/to/tmpBash
然後externalProg被成功執行。我也cout'd launchcmd字符串,複製並粘貼到終端,這也可以成功。出於某種原因,只有在我的程序中調用時纔會失敗。
經過一番實驗後,我確定system()在我們的集羣上調用了/ bin/sh。如果我改變launchcmd看起來像
/path/to/tmpBash
(使之充分命令應該是/ bin/sh的/路徑/到/ tmpBash),我得到拒絕的錯誤權限,這是毫不奇怪的。問題是,我不能chmod + x tmpBash文件,而它仍然是打開的,如果我關閉文件,它會被刪除 - 所以我不知道如何解決這個問題。
有沒有明顯的錯誤,我正在做,或系統()有一些細微差別,我錯過了?
編輯:我想補充一點,我可以成功調用之類的東西
system("echo $PATH")
,並得到預期的結果(在這種情況下,我的默認$ PATH)。
'ofstream launchcmd;'你是不是指['ostringstream launchcmd;'](http://en.cppreference.com/w/cpp/io/basic_ostringstream)? (只是因爲你說你想使用'系統(launchcmd.str()。c_str());') – 2014-12-03 22:56:57
我的意思是ostringstream!我編輯了我的問題來解決這個問題。 – kjfergu 2014-12-03 23:05:49