gpt4 book ai didi

unix - 杀死一个 Haskell 二进制文件

转载 作者:行者123 更新时间:2023-12-03 14:39:58 25 4
gpt4 key购买 nike

如果我按 Ctrl+C,这会引发异常(总是在线程 0 中?)。如果你愿意,你可以捕获它——或者更有可能的是,运行一些清理然后重新抛出它。但通常的结果是使程序以一种或另一种方式停止。

现在假设我使用 Unix kill命令。据我了解,kill基本上向指定的进程发送一个(可配置的)Unix 信号。

Haskell RTS 对此有何 react ?它是否记录在某处?我想发送 SIGTERM与按 Ctrl+C 的效果相同,但事实上我不知道...

(当然,您可以使用 kill 发送与杀戮毫无关系的信号。同样,我想 RTS 会忽略,例如 SIGHUPSIGPWR,但我不知道不确定。)

最佳答案

谷歌搜索“haskell catch sigterm”将我带到 System.Posix.Signals unix包,它有一个相当漂亮的系统来捕获和处理这些信号。只需向下滚动到“处理信号”部分。

编辑:一个简单的例子:

import System.Posix.Signals
import Control.Concurrent (threadDelay)
import Control.Concurrent.MVar

termHandler :: MVar () -> Handler
termHandler v = CatchOnce $ do
putStrLn "Caught SIGTERM"
putMVar v ()

loop :: MVar () -> IO ()
loop v = do
putStrLn "Still running"
threadDelay 1000000
val <- tryTakeMVar v
case val of
Just _ -> putStrLn "Quitting" >> return ()
Nothing -> loop v

main = do
v <- newEmptyMVar
installHandler sigTERM (termHandler v) Nothing
loop v

请注意,我必须使用 MVar 来通知 loop是时候退出了。我尝试使用 exitSuccess来自 System.Exit , 但由于 termHandler在不是主线程的线程中执行,它不会导致程序退出。可能有一种更简单的方法可以做到这一点,但我以前从未使用过这个模块,所以我不知道有一个。我在 Ubuntu 12.10 上对此进行了测试。

关于unix - 杀死一个 Haskell 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18430748/

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