2012-11-18 16 views
18

मैं निम्नलिखित दृष्टिकोण की कोशिश की:हास्केल में Ctrl-C हैंडलर कैसे लिखें?

import System.Exit 
import System.Posix.Signals 
import Control.Concurrent (threadDelay) 

main :: IO() 
main = do 
    installHandler keyboardSignal (Catch (do exitSuccess)) Nothing 
    threadDelay (1000000000) 

लेकिन यह केवल आउटपुट:

^CTest.hs: ExitSuccess 
Ctrl-C पर

, बजाय बाहर निकलने की। मुझे इसे ठीक से कैसे करना चाहिए?

उत्तर

20

installHandler की डॉक्स से:

हैंडलर स्थापित किया गया है जो एक नया सूत्र में कार्रवाई लागू करेगा जब (या कुछ ही समय बाद) संकेत प्राप्त होता है।

और exitWith:

नोट: GHC में, exitWith आदेश प्रक्रिया से बाहर निकलने के लिए मुख्य कार्यक्रम धागे से बुलाया जाना चाहिए। जब किसी अन्य धागे से बुलाया जाता है, तो बाहर निकलें एक एक्जिटएक्सप्शन सामान्य के रूप में फेंक देगा, लेकिन अपवाद प्रक्रिया को बाहर निकलने का कारण नहीं बनता है।

तो exitSuccess हैंडलर प्रक्रिया समाप्त नहीं करता है, और इसकी उम्मीद है (हालांकि अप्रत्याशित;) व्यवहार।

आप तत्काल कार्रवाई चाहते हैं,

import System.Exit 
import System.Posix.Signals 
import Control.Concurrent 

main :: IO() 
main = do 
    tid <- myThreadId 
    installHandler keyboardSignal (Catch (killThread tid)) Nothing 
    threadDelay (1000000000) 

सिग्नल प्राप्त करने के तुरंत बाद ही धागे को मारता है।

कम कठोर, यदि आप एक सफल बाहर निकलने चाहते हैं, हो सकता है

import System.Exit 
import System.Posix.Signals 
import Control.Concurrent 
import qualified Control.Exception as E 

main :: IO() 
main = do 
    tid <- myThreadId 
    installHandler keyboardSignal (Catch (E.throwTo tid ExitSuccess)) Nothing 
    threadDelay (10000000) 

मुझे लगता है कि यह भी मज़बूती से काम करेंगे, लेकिन मैं पूरी तरह यकीन नहीं है।

+0

लाइन 'थ्रेडडेले (10000000)' क्या करती है? – Langston

+1

['थ्रेडडेले'] (http://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Concurrent.html#v:threadDelay)" किसी दिए गए संख्या के माइक्रोसॉन्ड के लिए मौजूदा धागे को निलंबित करता है " सी में 'usleep' के समान। यहां, हम उपयोगकर्ता को Ctrl-C दबाए रखने के लिए पर्याप्त समय देने के एकमात्र उद्देश्य के लिए निष्पादन को निलंबित करते हैं। –

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