【问题标题】:Haskell: Execute external commands in strict sequenceHaskell:以严格的顺序执行外部命令
【发布时间】:2012-03-15 03:05:22
【问题描述】:

如果我遇到需要依次执行外部命令的情况,最好的解决方案是什么?

例如,我有两个命令“制作快照”和“备份快照” 在第一个完成之前,第二个无法开始。 如果我将这两个命令有序地粘贴在 do 语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个命令完整?

对于手动完成检查,使用“system”或 rawSystem 并检查它们的退出代码是否足够?

我不完全理解“system”和“runCommand”函数之间的区别。有人可以向我澄清这一点。我只能看到它们返回不同的值:退出代码与进程句柄。还有其他区别吗?

我是否需要使用“runCommand”才能使上述序列正常工作?我需要在进程句柄上调用 wait 吗?

谢谢。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我了解到您正在使用System.Process 模块来运行外部命令。这很好。

    该模块包含阻塞和非阻塞 IO 操作。非阻塞的(如createProcessrunCommand)创建一个进程并在它仍在运行时立即返回它的句柄。阻塞的(如readProcesssystem)不返回任何句柄,而是在进程终止后返回运行结果。

    为确保进程已终止,您需要使用阻塞操作,或使用waitForProcess,它会阻塞直到具有给定句柄的进程终止。

    使用 "system" 或 rawSystem" 并检查它们的退出代码是否足够?

    是的。

    “system”和“runCommand”函数的区别

    主要区别在于system 是阻塞的,而runCommand 不是。

    我是否需要使用“runCommand”才能使上述序列正常工作?

    不,在您的情况下,阻止呼叫就足够了。

    我需要在进程句柄上调用 wait 吗?

    仅当您决定使用非阻塞调用时。

    使用示例:

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

    【讨论】:

    • 感谢您为我澄清。有道理。
    • 在您的示例中,如何在运行第二个程序之前检查第一个程序是否成功终止?
    • @r.sendecky: ExitSuccess &lt;- system "make snapshot"system 调用的结果进行模式匹配——确保它返回ExitSuccess。如果模式匹配失败,则IO's fail is called.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多