Почему gnu readline требует от меня двойного нажатия на элемент управления c? - PullRequest
6 голосов
/ 23 декабря 2011

Обычно Control-C отправляет сигнал в программу и убивает его, если он не пойман. Библиотека 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

1 Ответ

8 голосов
/ 23 декабря 2011

Это может быть связано с режимами приготовленный / сырой / редкий ; ^C не всегда посылает сигнал. Кажется вероятным, что readline отсоединяет терминал, и поэтому любые сигналы, вызванные вводом с клавиатуры, должны быть связаны с логикой внутри самой readline; кажется правдоподобным, что он может запускать SIGINT только на двух последовательных ^C с (тем более, что для многих программ, использующих readline, таких как оболочки и REPL, программа, выходящая из одного ^C, будет очень раздражающей!) *

Возможно, вы сможете изменить это поведение, используя API readline для повторной привязки ^C к вашему собственному коду, который вызывает SIGINT. Я не использовал readline от Haskell, просто из C, поэтому я не уверен, как именно вы это сделаете, но привязка кажется достаточно богатой, чтобы ее достичь.

...