2013-08-26 54 views
0

我正在修改用MSDN C和Pro * C編寫的命令行程序(Oracle預編譯器編寫內聯SQL和PL/SQL語句),以便可以生成多個副本並同時處理。這是一個數據庫繁重的程序,併發性問題大多在數據庫端處理,所以我們認爲只運行多個副本比改變程序運行真正的多線程更容易。從C代碼生成一個程序的多個副本,並將輸出重定向到一個文件

無論如何,我們依靠printf()和輸出管道將程序的輸出寫入日誌文件以進行調試。我無法啓動適當寫入其自己的日誌文件的exe文件的單獨副本。我玩了很多exec()和system()函數來獲取EXE的不同副本來啓動和寫入日誌。我已經得到了工作最接近的是使用C線,如:

system("start cmd /k call [program commmand and args] > log_file.txt"); 

這個偉大的工程 - 產卵單獨的命令窗口,併產生程序輸入相應的數據集的單獨副本。唯一的問題是在程序執行完畢後,命令窗口保持打開狀態。我們的一些客戶經常在計劃程序上運行該程序,並且不得不手動關閉所有命令窗口。我試圖得到什麼,我找

其它類似的命令是這樣的:

system("[program command and args] > log_file.txt"); 

exec("[program command and args] > log_file.txt"); 

這兩個將執行該程序的新副本,寫到日誌文件就好了,並在進程結束時關閉命令窗口,但是這些命令會等待新生成的EXE完成運行,以便將控制權返回到啓動的可執行文件。這顯然可以防止多個副本同時運行,這是開始的整個目標,所以這也不是一個好的解決方案。

我還打了試圖通過追加到退出命令行添加一個「退出」命令,在命令行窗口的結束,希望我能得到的命令窗口關閉,像這樣:

system("start cmd /k call \"[program commmand and args] > log_file.txt; exit\""); 

無濟於事。我嘗試了一些類似的變化,但永遠不會有正確的行爲。

我會非常感謝任何建議,可以得到正確的行爲。我基本上希望使用Windows命令提示符的「> log_file.txt」輸出管道功能啓動多個可並行運行的可執行文件副本並寫入單獨的日誌文件。我想避免使用線程庫(這已經有一段時間了,我受到了時間限制)或者使用了printf()和輸出管道之外的東西,因爲這些打印語句在整個應用程序中都會使用,這將是一項很大的工作在這個時間點有效地替換所有的函數調用。

任何人都知道使用system()調用來獲取命令窗口關閉的方法,或者有其他一些簡單的方法來解決問題嗎?請記住,有一些時間限制,所以我不一定要找到最好的方式來做到這一點,但最快,最簡單。我將有機會盡快實現正確的日誌記錄功能,但我需要首先解決這個問題。

回答

2

你說你的第一個解決方案工作的很好,除了在程序執行完成後不關閉命令窗口。

system("start cmd /k call [program commmand and args] > log_file.txt"); 

/K選項狀態Carries out the command specified by string but remains

/C選項狀態Carries out the command specified by string and then terminates

你應該能夠改變你原來的解決方案,使用/ C選項,所以

system("start cmd /C call [program commmand and args] > log_file.txt"); 
相關問題