2010-10-30 21 views
3

我有一個C++ windows服務,當我調用system()函數來釋放命令時,它有時會崩潰。我已經在Windows命令行中運行了命令的確切文本,並且它運行得很好,但由於某種原因,它在system()運行時失敗。有沒有比用system()更好的在C++中提取命令的方法?

更糟糕的是,我似乎無法得到任何有關system()失敗原因的信息。似乎沒有提出異常,因爲我正在做一個捕捉(...),沒有任何東西被抓住。我的服務停止運行。我知道這是對system()的調用失敗,因爲我在調用之前和之後都放置了日誌信息,之後的任何事情都沒有記錄任何內容。

那麼,有沒有不同的方法可以剔除我的命令?至少,如果出現問題,某些事情會給我一些信息,或者至少讓我處理一個例外情況。

回答

0

你可以使用fork/exec,但我認爲這就是系統正在做的事情。

+0

'exec'肯定會給你更多的控制過程。許多系統也具有'spawn'功能。 – 2010-10-30 20:51:35

+0

不太可能,因爲它是Windows。更可能是CreateProcess或類似的。 – SimonJ 2010-10-30 20:53:05

+1

Fork在Windows API中不存在。 – 2010-10-30 22:07:03

1

我相信system()在技術上是C標準庫的一部分,因此不會拋出異常。您應該能夠檢查返回代碼或ERRNO變量以獲取有關發生的事情的一些信息。這個MSDN鏈接有關於Windows上可能的返回代碼的一些信息。

我也看到system()由於其他外部原因(例如病毒掃描程序)而失敗,因此您也可以調查此問題。

我不知道有更好的方法來運行shell命令,但我可能是錯的。

編輯:如果它仍然只是無緣無故地崩潰,你可以嘗試使用process monitor來看看下一步發生了什麼。由於進程監視器的輸出結果可能有點令人難以置信,我喜歡使用的一個技巧就是在調用system()之前向程序添加一個語句,以打開一個不存在的文件,如「C:\ MARKER.TXT」或其他內容,然後您可以在進程監視器輸出中搜索文件的名稱,然後查看可能與問題有關的條目。

+0

事情是,我的應用程序似乎只是在系統被調用時死亡。我打電話給系統後立即嘗試記錄一些內容,但我什麼都沒有收到。 – 2010-10-30 20:55:49

+0

你確定你傳遞給'system()'的字符串實際上包含你想要的嗎?作爲一個測試,你可以嘗試使用不同的命令來運行'system()',比如'sleep'或者其他東西,看看它是否有效。 – WildCrustacean 2010-10-30 20:57:30

+0

運行系統(「dir」),看看你是否有東西 – 2010-10-30 21:03:41

1

普通捕獲()不會捕獲致命的異常(例如段錯誤)。你必須使用結構化的異常處理。更好的是,啓用事後調試; this article解釋瞭如何啓用服務的驗屍調試。

0

我認爲你的問題可能是你的服務相關的用戶帳戶。

有一個環境問題(缺少路徑中的條目)或服務用於運行的帳戶沒有權限執行任何您試圖運行的權限。

運行services.msc並查看您的服務的屬性。 在登錄頁面上,作爲測試,更改設置,以便它使用您的帳戶運行服務。如果成功了,你就知道問題是什麼。

另一個需要注意的是服務中的路徑。使用getenv(「PATH」)並查看您可能依賴的路徑是否缺失。

希望這有助於...

0

我最終使用的CreateProcess。到目前爲止,它一直在努力。

相關問題