通常、Control-Cはsigintをプログラムに送り、捕捉されていなければ殺します。 gnureadlineライブラリはsigintのハンドラをインストールします。しかし、これらのハンドラをhaskellで無効にしても、プログラムを強制終了するためにControl-Cを2回押す必要があります。どうしたの?なぜgnuのreadlineはコントロールcを2回押す必要がありますか?
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が2つの連続した '^ C 'に対してのみSIGTERMを引き起こす可能性があります。 – ehird
ああ、面白いです。私は端末モードについては知らなかった。私はreadlineがそれを使って何かをしているかどうかを調べます。ありがとうございました。 – archgoon
私はそれを少し答えに拡張しました:) – ehird