2012-03-15 62 views
7

如果我處於需要按順序執行外部命令的情況,那麼最佳解決方案是什麼?Haskell:按嚴格順序執行外部命令

例如,我有兩個命令「創建快照」和「備份快照」 第二個無法啓動,直到第一個完成。 如果我有條件地將這兩個命令粘在do語法中,它們會被一個接一個地執行還是必須手動檢查並確保第一個命令是完整的?

對於手動完成檢查,是不是足夠使用「系統」或rawSystem」,並檢查他們的退出代碼?

我不完全理解之間的區別‘系統’和‘runCommand’功能。能有人向我澄清這一點,我只能看到他們返回不同的值:退出代碼與進程句柄。其他區別?

我是否需要使用「runCommand」來處理上述序列?是否需要調用等待進程句柄?

感謝。

回答

11

我知道您使用System.Process模塊來運行外部命令。這很好。

該模塊包含阻塞和非阻塞IO動作。非阻塞的(如createProcess,runCommand)創建一個進程,並在它仍在運行時立即返回它的句柄。阻塞的(如readProcess,system)不返回任何句柄,而是返回運行流程的結果。

爲了確保進程已終止,您需要使用阻止操作,或使用waitForProcess,這會阻止給定句柄的進程死亡。

是足夠使用 「系統」 或rawSystem」,並檢查他們的退出代碼?

是。

之間的區別 「系統」 和 「runCommand」 功能

主要區別在於system被阻擋,而runCommand不是。

請問我最好使用「runCommand」爲上述序列的工作?

沒有,阻塞調用應該足夠你的情況。

我需要調用等待進程句柄?

只有當你決定使用非阻塞調用。用法

例子:

import System.Process 
main = do 
    ExitSuccess <- system "make snapshot" 
    ExitSuccess <- system "backup snapshot" 
    return() 
+0

感謝澄清對我來說。說得通。 – 2012-03-15 05:17:59

+0

在你的例子中,如何在運行第二個程序之前檢查第一個程序是否成功終止? – 2012-03-15 05:21:02

+4

@ r.sendecky:'ExitSuccess < - system「make snapshot」'對'system'調用的結果進行模式匹配 - 確保它返回'ExitSuccess'。如果模式匹配失敗,則調用[IO的'fail'](http://en.wikibooks.org/wiki/Haskell/do_Notation#Translating_the_bind_operator)。 – rampion 2012-03-15 06:42:52