gpt4 book ai didi

haskell - 保证终止 Haskell 中的外部进程

转载 作者:行者123 更新时间:2023-12-02 01:32:16 26 4
gpt4 key购买 nike

我已经像这样启动了一个 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 进程中,调用其中一个函数,并读取其结果,所有这些都是有问题的。

我的问题是,有时某些函数在调用时会不确定地运行,例如 f n = sum [n..],当发生这种情况时,我想终止外部 GHCi 进程。

为此,我尝试调用函数 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 时,它也会阻塞。

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

关于haskell - 保证终止 Haskell 中的外部进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33446996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com