2012-03-15 69 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