[英]Haskell: Conditionally execute external process with Maybe FilePath
[英]Guaranteed termination of external process in Haskell
我已经推出了这样的GHCi外部流程
(Just hin, Just hout, _, pid) <- createProcess (proc "ghci" ["-fdefer-type-errors"])
{ std_in = CreatePipe, std_out = CreatePipe, std_err = UseHandle stdout }
我通过写入hin
和hout
阅读来控制。 这用于将Haskell文件加载到外部GHCi进程,调用其中一个函数,并读取其结果,这一切都有问题。
我的问题是,有时会有一些函数在调用时无限运行,比如fn = sum [n..]
,当发生这种情况时,我想终止外部GHCi进程。
为此,我尝试调用函数terminateProcess pid
但它不会可靠地terminateProcess pid
进程; 通常,外部进程停止工作,但在控制台上键入$ ps
时仍然会出现。 例如,当ghc外部进程正在吃处理器时,这是top输出的示例:
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
当我尝试使用terminateProcess pid
结束它时,它通常会将进程降低到0%CPU,但仍然存在:
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
有时候,我需要多次调用terminateProcess pid
来使外部ghc停止,但它总是在那里。 即便如此,在它停止之后,当我尝试waitForProcess pid
这waitForProcess pid
时。
在Haskell中是否有可靠的方法可以完全终止外部进程? 就像unix kill -9 38309
一样吗?
谢谢
在Posix系统上, terminateProcess
只发送一个SIGTERM信号。
下面是一些代码,演示了如何将SIGKILL信号发送到使用System.Process
创建的Posix进程:
import System.Process
import System.Process.Internals
import System.Posix.Signals
main = do
(_, _, _, ph) <- createProcess (shell "asd")
-- ...
withProcessHandle ph $ \ph_ ->
case ph_ of
OpenHandle pid -> signalProcess sigKILL pid
ClosedHandle _ -> return () -- shouldn't happen
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.