通常情况下,Control-C发送一个sigint给程序,如果它没有被捕获,就杀死它。gnureadline库将为sigint安装处理程序。然而,即使在haskell中禁用了这些处理程序,我仍然需要按两次Control-C来终止程序。这是怎么呢
import System.Console.Readline
main = do
setCatchSignals False
mainLoop
mainLoop = do
maybeLine <- readline ">"
case maybeLine of
Nothing -> putStrLn ":("
Just line -> do
putStr line
putStr " catch:"
catch <- getCatchSignals
putStrLn $ show $ catch
mainLoop
这可能与熟/生/稀有终端模式有关;^C
并不总是发送信号。readline似乎很可能会打开终端,因此键盘输入引起的任何信号都必须归因于readline本身的逻辑;它似乎可能只在两个连续的^C
上触发SIGINT(特别是因为对于许多使用readline的程序,如shell和reps,程序在单个^C
上退出将非常烦人!)。
您可以通过使用readline API将^C
重新绑定到您自己的一些触发SIGINT的代码来改变这种行为。我没有使用Haskell的readline,只使用C语言,所以我不确定你会怎么做,但是绑定似乎足够丰富,可以实现它。