gpt4 book ai didi

haskell - 我可以禁用 control-C 吗?

转载 作者:行者123 更新时间:2023-12-04 00:39:50 24 4
gpt4 key购买 nike

有没有办法在常规运行的外壳 Haskell 可执行文件中禁用(暂时)控制 C 的中断效果?

背景:我每年都有一个小练习。这是一个游戏,学生在表达式中 zipper 触发模式匹配重写适用,使用 hncurses 在 shell 窗口中运行。当学生们完成最后一个谜题后,他们会得到一个个人密码,他们需要将其发送给我。作为 Windows 的老手和 Unix 的新手,当然(当然)很懒惰,他们倾向于选择密码并输入 control-C。这具有中断程序并导致他们的密码消失的意外效果。恢复它的唯一方法是重复练习。多么残忍!

虽然还有其他方法可以解决这个问题(例如,打印警告消息或将密码写入文件),但我很想知道是否有办法禁用 control-C。

最佳答案

是的,你只需要暂时忽略 SIGINT:

import Prelude hiding (catch)
import Control.Exception
import Control.Concurrent
import System.Posix.Signals

-- Ensures the original handler is restored even after an exception.
--
-- installHandler returns the previous signal handler, so if you're
-- tied to some existing main loop, you could instead just keep
-- its return value around for later restoration.
ignoreSignal :: Signal -> IO a -> IO a
ignoreSignal sig = bracket (install Ignore) install . const
where install handler = installHandler sig handler Nothing

pause :: IO ()
pause = threadDelay 2000000

main :: IO ()
main = do
ignoreSignal keyboardSignal $ do
putStrLn "Ctrl+C disabled."
pause
putStrLn "\nCtrl+C re-enabled."
pause

(如果您想更直接地命名,也可以将 keyboardSignal 写成 sigINT。)

您也可以替换 IgnoreCatch m , 其中 m是打印有关复制文本的正确方法的指导的一些操作。 (不过要小心;它将在单独的 Haskell 线程中运行。)

关于haskell - 我可以禁用 control-C 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8969733/

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