Guaranteed termination of external process in Haskell -
i have launched ghci external process this
(just hin, hout, _, pid) <- createprocess (proc "ghci" ["-fdefer-type-errors"]) { std_in = createpipe, std_out = createpipe, std_err = usehandle stdout }
which control writing hin
, reading hout
. used load haskell file external ghci process, call 1 of functions, , read results, problematic.
my problem there function runs indefinetely when called, f n = sum [n..]
, , when happens want terminate external ghci process.
to so, have tried calling function terminateprocess pid
not kill process reliably; in general, external process stops working, yet still appears when type $ ps
@ console. example, example of top's output when ghc external process eating processor:
pid command %cpu time ... 38312 top 3.3 00:00.89 38309 ghc 99.9 00:21.46 38306 ghc 0.0 00:00.82
and when try end using terminateprocess pid
brings down process 0% cpu, still there:
pid command %cpu time ... 38312 top 3.3 00:00.89 38309 ghc 0.0 00:21.46 38306 ghc 0.0 00:00.82
sometimes, need call terminateprocess pid
several times make external ghc stop, yet sill there. then, after stopped, when try waitforprocess pid
1 blocks.
is there reliable way in haskell terminate external process sure? unix kill -9 38309
does?
thanks
on posix systems terminateprocess
sends sigterm signal.
here code demonstrates how send sigkill signal posix process created using system.process
:
import system.process import system.process.internals import system.posix.signals main = (_, _, _, ph) <- createprocess (shell "asd") -- ... withprocesshandle ph $ \ph_ -> case ph_ of openhandle pid -> signalprocess sigkill pid closedhandle _ -> return () -- shouldn't happen
Comments
Post a Comment