6
通常情況下,Control-C向程序發送一個sigint,如果它沒有被捕獲,則會終止它。 gnureadline庫將安裝sigint的處理程序。但是,即使在haskell中禁用這些處理程序時,我仍然需要敲兩次Control-C來殺死一個程序。這是怎麼回事?爲什麼gnu readline要求我兩次打控制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只在兩個連續的'^ C'上產生一個SIGTERM。 – ehird 2011-12-23 19:47:14
哦,有趣。我不知道有關終端模式。我會檢查一下readline是否做了一些事情。謝謝。 – archgoon 2011-12-23 19:49:34
我已將它稍微擴展爲答案:) – ehird 2011-12-23 19:59:25