2012-03-29 11 views
5

द्वारा निष्पादित हैंडल निकास आदेश मेरे पास एक छोटा खोल एप्लिकेशन है जो Tcl कोड के कुछ सेट निष्पादित करने के लिए Tcl एम्बेड करता है। Tcl_CreateInterp का उपयोग कर टीसीएल दुभाषिया शुरू किया गया है। सब कुछ बहुत सरल है:एम्बेडेड टीसीएल रनटाइम

  1. उपयोगकर्ता प्रकार Tcl आदेश
  2. आदेश मूल्यांकन के लिए Tcl_Eval के लिए पारित हो जाता है
  3. दोहराने

लेकिन अगर एक उपयोगकर्ता प्रकार 'exit', जिसमें एक मान्य Tcl है आदेश, पूरी बात - टीसीएल दुभाषिया और मेरा खोल आवेदन - स्वचालित रूप से बाहर निकलें।

प्रश्न: क्या कोई तरीका है कि मैं टीसीएल दुभाषिया से आने वाले इस निकास संकेत को पकड़ सकता हूं। मैं वास्तव में हर उपयोगकर्ता कमांड की जांच नहीं करना चाहता हूं। मैंने Tcl_CreateExitHandler की कोशिश की, लेकिन यह काम नहीं किया।

बहुत बहुत धन्यवाद।

+1

शीर्षक और "tcllib" को हटाए गए संदर्भों को फिक्स्ड किया गया है क्योंकि एक मानक लाइब्रेरी * के लिए * टीसीएल [आमतौर पर उस नाम से जाना जाता है] (http://tcllib.sourceforge.net/)। आप वास्तव में संदर्भित करते हैं कि आपके प्रोग्राम में टीसीएल रनटाइम एम्बेड करना है। – kostix

+0

'Tcl_CreateExitHandler' बाहर निकलने और संसाधनों को जारी करने के लिए है (उदा।, डेटाबेस कनेक्शन) जो अन्यथा घबराहट से घूमते हैं। यह होने से बाहर निकलने से नहीं रोक सकता है। –

+0

यह वास्तव में वही है जो मैं करना चाहता हूं - बाहर निकलने पर संसाधनों को छोड़ दें। इस मामले में 'Tcl_CreateExitHandler' क्यों काम नहीं करेगा? – ilya1725

उत्तर

0

Tcl_CreateExitHandler का उपयोग ठीक काम करता है। समस्या यह थी कि मैंने हैंडलर कार्यान्वयन में printf जोड़ा और आउटपुट टर्मिनल पर दिखाई नहीं दिया। तो मैंने सोचा कि इसे बुलाया नहीं गया है। हालांकि, जब तक इस हैंडलर को निष्पादित किया जाता है तब तक कोई stdout नहीं होता है। एप्लिकेशन पर strace चलाने से पता चलता है कि हैंडलर को ठीक से निष्पादित किया जा रहा है।

इस समस्या का एक और समाधान atexit का उपयोग करना और बाहर निकलने की घटना को संसाधित करना हो सकता है।

8

आदेश

rename exit "" 

से छुटकारा या यह फिर से परिभाषित करने देने के लिए उपयोगकर्ता जानते हैं कि यह विकलांग है:

proc exit {args} { error "The exit command is not available in this context" } 
इसके अलावा मुख्य में विचार कर एक safe interp में उपयोगकर्ता के कोड चल रहा है लायक बजाय

खोल। ऐसा करने से आपको उस पर नियंत्रण करने की अनुमति मिल जाएगी जो उपयोगकर्ता के पास है।

आप भी एक बच्चे इंटरप (गैर-सुरक्षित) बनाने में सक्षम हो सकते हैं और उस इंटरप के लिए निकास कमांड को अक्षम कर सकते हैं।

अंत में, आप बस कुछ और करने के लिए बाहर निकलने का नाम बदलने सकता है, अगर आप केवल उन गलती से उसे लिखने से बचने के लिए कोशिश कर रहे हैं:

rename exit __exit 

proc exit {args} { 
    puts -nonewline "Do you really want to exit? (y/n) " 
    flush stdout 
    gets stdin answer 
    if {$answer == "y"} { 
     __exit [lindex $args 0] 
    } 
} 

इस तरह:

namespace eval ::hidden {} 
rename exit ::hidden::exit 
+0

यह काम कर सकता है। लेकिन मैं अभी भी 'बाहर निकलने' कॉल को संरक्षित करना चाहता हूं। – ilya1725

+4

यदि आप अपने लिए बाहर निकलना चाहते हैं, लेकिन उपयोगकर्ता के लिए नहीं, तो मैं सुरक्षित इंटरप रूट की अनुशंसा करता हूं। – RHSeeger

+2

+1 सुरक्षित इंटरप लगभग –

1

exit आदेश का नाम बदलें , जब उपयोगकर्ता exit टाइप करता है, तो वह आपके कस्टम निकास आदेश को निष्पादित करेगा, जिसमें आप अपनी पसंद की कुछ भी कर सकते हैं।

+0

धन्यवाद, है। हालांकि, यह अभी भी मेरी समस्या का समाधान नहीं करता है - अगर टीसीएल से 'निकास' कहा जाता है तो मेरा पूरा सी ऐप बिना शर्त बंद हो जाता है। मुझे अभी भी बाहर निकलने पर कुछ संसाधनों को साफ करने की जरूरत है। – ilya1725

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