2014-05-14 31 views
5

有了一个脚本像正确终止催生runghc过程

-- foo.hs 
import System.Process 
import Control.Concurrent 

main = do 
    a <- runCommand "yes" 
    threadDelay 1000000 
    terminateProcess a 

我得到预期的行为 - yes运行,直到threadDelay到了。但是,如果我有"runghc bar.hs",其中bar.hs更换"yes"

import Control.Monad 
import Control.Concurrent 

main = forever (print 5 >> threadDelay 100000) 

...然后bar.hs始终运行。有没有更好的方法让runghc终止?

编辑: 此行为是在Linux上

回答

5

这是相当有趣的行为。发生什么事是runghc会产生它自己的子进程,并且你会终止runghc进程而不是子进程。使用interruptProcessGroupOf代替terminateProcess似乎在这里做了诀窍,虽然我不知道这是否是一个可靠/正确的解决方案。

+0

这种行为是相当令人惊讶,恕我直言。它可以被认为是GHC运行时的一个bug,特别是因为这个孩子没有被Haskell程序员明确地产生,但是在运行时,因此它很难被覆盖。 – chi

+1

@chi嗯,我确定它不是运行时,而是'runghc',它选择产生一个进程。但我同意你的结论,认为'runghc'选择这样做有点令人惊讶。我怀疑这只是实现它的简单方法:我敢打赌,我们基本上看到了'ghci'沙盒,即使没有需要沙箱的封闭进程。 –

+0

我与'''interruptProcessGroupOf'''混合成功,但它比我知道的任何其他东西都好。谢谢 – amindfv