为什么gnu readline要求我按control c两次



通常情况下,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语言,所以我不确定你会怎么做,但是绑定似乎足够丰富,可以实现它。