代码之家  ›  专栏  ›  技术社区  ›  ivan

干净地替换当前的Haskell进程(exec)

  •  0
  • ivan  · 技术社区  · 7 年前

    我正在写一个Haskell程序,它的唯一目的是执行另一个(非Haskell)程序,在收集一些信息以确定该程序应该用什么参数执行之后。

    替换正在运行的Haskell进程非常容易 executeFile ,但我想知道是否有办法确保Haskell程序在被替换之前能够在自身之后正确地进行清理。

    例如, Control.Exception.finally 对于确保即使发生异常也执行清理操作通常很有用,但如果执行整个不同的进程,则不会有任何影响:

    module Main (main) where
    
    import Control.Exception    (finally)
    import System.Posix.Process (executeFile)
    
    main = finally (do putStrLn "opening file descriptors"
                       putStrLn "writing temporary files"
                       executeFile "ls" True [] Nothing)
                   (putStrLn "cleaning up")
    

    有没有一种推荐的方法来“干净地”执行这样的操作?

    0 回复  |  直到 7 年前
        1
  •  3
  •   chepner    7 年前

    你需要把 executeFile 之后 finally ,因为它完全取代了 Haskell程序的代码。

    main = do
        finally (putStrLn "opening" >> putStrLn "writing") (putStrLn "cleaning up")
        executeFile "ls" True [] Nothing
    

    执行文件 是exec本身的一个问题,但是您必须像exec可以工作一样继续,而不是返回Haskell代码;这是单向的 goto ,不是子例程调用。

        2
  •  3
  •   Joseph Sible-Reinstate Monica    7 年前

    哈斯克尔对此没有什么特别之处。如果你想在一个过程完成后做一些事情,你不能 exec(3) / executeFile 它。你必须改 fork(2) / forkProcess ,然后在父对象中,执行 waitpid(2) / getProcessStatus 在孩子身上,一旦孩子回来,你就要清理干净。


    编辑:以上是新流程完成后的清理。如果你不在乎,只想在Haskell完成但新进程仍在运行时清理,那么chepner的答案将起作用。

    推荐文章