2014-12-03 26 views
2

我有一個程序需要運行一個程序,我們將在我們的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)。

+0

'ofstream launchcmd;'你是不是指['ostringstream launchcmd;'](http://en.cppreference.com/w/cpp/io/basic_ostringstream)? (只是因爲你說你想使用'系統(launchcmd.str()。c_str());') – 2014-12-03 22:56:57

+0

我的意思是ostringstream!我編輯了我的問題來解決這個問題。 – kjfergu 2014-12-03 23:05:49

回答

1

兩個獨立的想法:

  • 更改SHELL環境變量設置爲/bin/bash,然後調用system()

或:

  • 使用execve directly'的execve('/斌/ bash',['/ path/to/tmpBash'],environ)
+0

我檢查了,$ SHELL已經是/ bin/bash。 我正在嘗試execve或execv,但我仍然遇到與以前相同的問題,很奇怪。 – kjfergu 2014-12-03 23:40:33

+0

@ user3741834:你可以給我一些功能性的示例代碼來玩嗎?我很樂意從一開始就解決它,但我不想從頭開始寫它。 – 2014-12-03 23:41:23

+0

這裏一秒鐘。我不能直接粘貼我的代碼(安全問題),但我正在創建一個重新創建問題的示例。 – kjfergu 2014-12-03 23:45:42