2012-01-23 16 views
12

क्या नियमित रूप से चल रहे-इन-ए-शैल हास्केल निष्पादन योग्य में नियंत्रण-सी के बाधित प्रभाव को अस्थायी रूप से अक्षम करने का कोई तरीका है?क्या मैं नियंत्रण-सी अक्षम कर सकता हूं?

संदर्भ: मेरे पास एक छोटा सा अभ्यास है जिसे मैंने प्रत्येक वर्ष निर्धारित किया है। यह एक ऐसा गेम है जहां छात्र अभिव्यक्ति के चारों ओर अभिव्यक्ति के रूप में अभिव्यक्ति के रूप में पैटर्न मिलान को ट्रिगर करते हैं, hncurses का उपयोग करके एक खोल विंडो में चल रहे हैं। जब छात्रों ने आखिरी पहेली पूरी की है, तो उन्हें एक व्यक्तिगत पासवर्ड मिलता है जिसे उन्हें मुझे भेजने की आवश्यकता होती है। विंडोज दिग्गजों और यूनिक्स newbies होने के नाते, और निश्चित रूप से (आभारी) आलसी, वे पासवर्ड का चयन करते हैं और नियंत्रण-सी टाइप करते हैं। इस कार्यक्रम में बाधा डालने और उनके पासवर्ड को गायब होने का अनपेक्षित प्रभाव है। इसे ठीक करने का एकमात्र तरीका व्यायाम को दोहराना है। कितना निर्दयी!

जबकि अन्य तरीकों से मैं समस्या के आसपास काम कर सकता हूं (उदाहरण के लिए, एक चेतावनी संदेश प्रिंट करना या फ़ाइल में पासवर्ड लिखना), मुझे यह जानकर उत्सुकता है कि नियंत्रण-सी अक्षम करने का कोई तरीका है या नहीं।

+0

मुझे पता है कि यह कुछ साल पुराना है, लेकिन आपको सिग्नल ब्लॉक स्थापित करने के बजाय उपयोगकर्ता के टर्मिनल को रिवायर करने, आपके प्रोग्राम के भीतर से कुछ सुझाव देने में सक्षम होना चाहिए। यह मुझे सबसे साफ दृष्टिकोण के रूप में मारता है। – dfeuer

उत्तर

12

हाँ, तुम सिर्फ अस्थायी रूप से अनदेखी करने के लिए SIGINT है: (। तुम भी keyboardSignalsigINT के रूप में लिख सकते हैं अगर आप इसे और अधिक सीधे नामकरण करना चाहते हैं)

import Prelude hiding (catch) 
import Control.Exception 
import Control.Concurrent 
import System.Posix.Signals 

-- Ensures the original handler is restored even after an exception. 
-- 
-- installHandler returns the previous signal handler, so if you're 
-- tied to some existing main loop, you could instead just keep 
-- its return value around for later restoration. 
ignoreSignal :: Signal -> IO a -> IO a 
ignoreSignal sig = bracket (install Ignore) install . const 
    where install handler = installHandler sig handler Nothing 

pause :: IO() 
pause = threadDelay 2000000 

main :: IO() 
main = do 
    ignoreSignal keyboardSignal $ do 
    putStrLn "Ctrl+C disabled." 
    pause 
    putStrLn "\nCtrl+C re-enabled." 
    pause 

तुम भी Catch m साथ Ignore बदल सकते , जहां m कुछ ऐसी क्रिया है जो टेक्स्ट कॉपी करने के सही तरीके से मार्गदर्शन प्रिंट करती है। (हालांकि सावधान रहो, यह एक अलग हास्केल सूत्र में चलाएँगे।)

1

आप स्पष्ट रूप से अपवाद है, जो मेरा मानना ​​है कि UserInterrupt है पकड़ सकते थे:

handle (\exception -> do 
    case fromException exception of 
      Just UserInterrupt -> -- return to problem 
      _     -> error "unhandled exception") playWithStudents 
8

त्वरित और आसान, खोल का उपयोग करें:

stty intr ^T 
run your haskell program here 
stty intr ^C 

इसमें अतिरिक्त लाभ है कि प्रोग्राम अभी भी बाधित हो सकते हैं।

संबंधित मुद्दे