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