2011-12-23 24 views
6

Normalnie Control-C wysyła sigint do programu i zabija go, jeśli nie zostanie przechwycony. Biblioteka gnureadline zainstaluje programy obsługi dla sigint. Jednak nawet po wyłączeniu tych procedur obsługi w haskell nadal muszę dwukrotnie nacisnąć Control-C, aby zabić program. Co się dzieje?Dlaczego readlinka gnu wymaga ode mnie dwukrotnego naciśnięcia klawisza 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 
+2

Może to być związane z gotowanymi/niegotowanymi/rzadkimi trybami zacisków; '^ C' nie zawsze wysyła sygnał. Mogłoby się zdarzyć, że readline powoduje, że SIGTERM występuje tylko na dwóch sekwencyjnych '^ C's. – ehird

+0

Och, interesujące. Nie wiedziałem o tym w trybach terminalowych. Sprawdzę i zobaczę, czy readline coś z tym robi. Dziękuję Ci. – archgoon

+0

Rozwinąłem to nieco do odpowiedzi :) – ehird

Odpowiedz

8

Może to być związane z trybami zacisków cooked/uncooked/rare; ^C nie zawsze wysyła sygnał. Wydaje się prawdopodobne, że readline nie odbiera terminalu, a zatem wszelkie sygnały spowodowane przez wejście klawiatury muszą wynikać z logiki samej readline; wydaje się prawdopodobne, że może wywołać tylko SIGINT na dwóch sekwencyjnych ^C s (zwłaszcza, że ​​dla wielu programów wykorzystujących readline, takich jak powłoki i REPLs, program wychodzący z pojedynczego ^C byłby bardzo irytujący!).

Możesz zmienić to zachowanie za pomocą interfejsu API readline, aby ponownie powiązać ^C z jakimś własnym kodem, który wyzwala SIGINT. Nie używałem readline od Haskella, tylko z C, więc nie jestem pewien dokładnie, jak byś to zrobił, ale the binding wydaje się wystarczająco bogaty, aby to osiągnąć.

Powiązane problemy