2014-05-14 13 views
5

Con uno script comecorrettamente Terminare ha generato runghc processo

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

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

ottengo comportamento previsto - yes piste fino a quando il threadDelay è in alto. Ma se sostituisco "yes" con "runghc bar.hs", dove bar.hs è

import Control.Monad 
import Control.Concurrent 

main = forever (print 5 >> threadDelay 100000) 

... poi bar.hs corre sempre. C'è un modo migliore per far terminare il runghc?

Edit: Questo comportamento è in linux

risposta

5

Questo è un comportamento abbastanza divertente. Quello che succede è che runghc genera il proprio processo figlio e si uccide il processo runghc ma non il bambino. Usare interruptProcessGroupOf al posto di terminateProcess sembra fare il trucco qui, anche se non so davvero abbastanza per dire se sia una soluzione affidabile/corretta.

+0

Questo comportamento è piuttosto sorprendente, IMHO. Potrebbe essere considerato un bug del runtime di GHC, soprattutto perché il figlio non è stato generato esplicitamente dal programmatore Haskell, ma dal runtime, quindi sembra difficile sovrascriverlo. – chi

+1

@chi Beh, sono sicuro che non è il runtime, ma piuttosto 'runghc' che sta scegliendo di generare un processo. Ma sono d'accordo con la tua conclusione che è un po 'sorprendente che "runghc" scelga di farlo. Sospetto che questo sia il modo più semplice per implementarlo: scommetto che stiamo essenzialmente vedendo sandboxing di 'ghci', anche se non c'è alcun processo di chiusura che richiede una sandbox. –

+0

Ho avuto un successo misto con '' 'interruptProcessGroupOf''', ma è meglio di qualsiasi altra cosa io sappia. Grazie – amindfv

Problemi correlati