Корректно завершить порожденный процесс runghc

С таким скриптом

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

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

Я получаю ожидаемое поведение - yes работает до тех пор, пока threadDelay не встанет. Но если я заменю "yes" на "runghc bar.hs", где bar.hs

import Control.Monad
import Control.Concurrent

main = forever (print 5 >> threadDelay 100000)

...тогда bar.hs работает вечно. Есть ли лучший способ заставить runghc завершить работу?

Изменить: это поведение в Linux


person amindfv    schedule 14.05.2014    source источник


Ответы (1)


Это довольно забавное поведение. Происходит то, что runghc порождает собственный дочерний процесс, и вы убиваете процесс runghc, но не дочерний процесс. Использование interruptProcessGroupOf вместо terminateProcess похоже трюк здесь, хотя я действительно не знаю достаточно, чтобы сказать, является ли это надежным/правильным решением.

person Daniel Wagner    schedule 14.05.2014
comment
Такое поведение довольно удивительно, ИМХО. Это можно рассматривать как ошибку среды выполнения GHC, особенно потому, что дочерний элемент был явно порожден не программистом Haskell, а средой выполнения, поэтому его трудно переопределить. - person chi; 14.05.2014
comment
@chi Ну, я уверен, что это не среда выполнения, а скорее runghc, которая выбирает создание процесса. Но я согласен с вашим выводом, что немного удивительно, что runghc решил сделать это. Я подозреваю, что это просто простой способ реализовать это: держу пари, что мы, по сути, наблюдаем ghci песочницу, даже несмотря на то, что нет вмещающего процесса, которому нужна песочница. - person Daniel Wagner; 15.05.2014
comment
У меня неоднозначный успех с interruptProcessGroupOf, но это лучше, чем все, что я знаю. Спасибо - person amindfv; 15.05.2014