क्या कई बार ctrl-c दबाने से रनिंग प्रोग्राम ज्यादा जल्दी बंद हो जाता है?


41

मैं अक्सर एक बड़ी फ़ाइल पढ़ना शुरू कर देता हूं और फिर थोड़ी देर के बाद छोड़ना चाहता हूं, लेकिन प्रोग्राम
Ctrl+ Cको दबाने से अंतराल तक रुक जाता है। क्या कई बार Ctrl+ Cकुंजी दबाकर लैग को छोटा करने का एक मौका है ? या मैं अपने कीपेस बर्बाद कर रहा हूँ?


मैंने देखा है कि विभिन्न बाल प्रक्रियाओं को कॉल करने वाली प्रक्रिया को चलाने के दौरान, Ctrl-C कभी-कभी चल रहे बच्चे को बाधित करेगा, लेकिन मूल प्रक्रिया नहीं। यह सच है bash, लेकिन ऐसा मामला नहीं है zshजिसमें हमेशा माता-पिता को बंद कर दिया जाए। यह एक कारण है जो मुझे पसंद है zsh
joeytwiddle

17
हां, जैसे एलेवेटर बटन या क्रॉस-वॉक बटन को बार-बार दबाने से एलेवेटर जल्दी या रोशनी में तेजी से हरे रंग की बारी आएगी।
माइकल

3
हाँ, एलेवेटर और क्रॉसवॉक बटन की तरह, CTRL-C भी चिपचिपा या जंग खा सकता है या iffy कनेक्शन विकसित कर सकता है। अधिक बार दबाना एक अच्छी रणनीति है क्योंकि लिफ्ट में आने के लिए केवल एक प्रेस को ही पंजीकरण करना होता है, वॉक साइन को लाइट अप करने के लिए, या प्रोग्राम को बंद करने के लिए।
हिप्पिट्रैमिल

1
@ इप्पिएट्रिल लेकिन आपका खोल ^Cतब छपेगा जब वह प्रेस को पंजीकृत करेगा (कम से कम बैश करता है)
wchargin

1
इसके लायक होने के लिए, मैं इसे अपने कीपेस को बर्बाद करने पर विचार नहीं करता - मैं इसे गैर-हानिकारक तरीके से कुछ हताशा को बाहर निकालने पर विचार करता हूं। (मैं आमतौर पर इसे 2-3 बार मारता हूं, लेकिन यह आंशिक रूप से है क्योंकि मैं "फोन लाइनों पर संलग्न टर्मिनलों पर" बड़ा हुआ हूं, जहां आप हमेशा मशीन तक पहुंचने वाले हर एक कीस्ट्रोके पर भरोसा नहीं कर सकते।)
केशलाम

जवाबों:


35

पहले के बाद Ctrl-C, कार्यक्रम प्राप्त होगा SIGINTऔर आमतौर पर सफाई शुरू होती है (टीएमपी फ़ाइलों को हटाना, सॉकेट्स बंद करना आदि)। यदि आप Ctrl-Cफिर से हिट कर रहे हैं, जो चल रहा है, तो ऐसा हो सकता है कि आप क्लीन अप रुटीन को बाधित करें (यानी अतिरिक्त सिग्नल को अकेला छोड़ दिए जाने के बजाय उस पर कार्रवाई की जा सकती है), जो एक गड़बड़ है। हालांकि यह आमतौर पर ऐसा नहीं है, और अधिक सामान्यतः अतिरिक्त संकेतों वास्तव में भेजा जाता है के बादप्रक्रिया समाप्त हो गई (सिस्टम के साथ ऑपरेटर की बातचीत में अंतर्निहित देरी के कारण)। इसका मतलब है कि सिग्नल एक अन्य प्रक्रिया (अक्सर शेल, लेकिन हमेशा नहीं) द्वारा प्राप्त किए जाते हैं। यदि वह प्राप्तकर्ता इस सिग्नल को ठीक से हैंडल नहीं करता है (जैसे शेल आमतौर पर करता है - जेनी डी का जवाब देखें) तो आप ऐसी कार्रवाई के परिणाम से अप्रिय रूप से आश्चर्यचकित हो सकते हैं।


क्यों यह स्वच्छ दिनचर्या को बाधित करना चाहिए? यह सिर्फ एक और संकेत है INTकि प्रक्रिया ठीक हो जाती है।
अराजक

4
@ आचोस क्यों चाहिए? यह तब होना चाहिए जब सफाई नियमित रूप से लटका दी गई है और आप इसे रोकना चाहते हैं। क्या यह वास्तव में इस तरह से काम करता है? हां, काफी बार। आप इसे बस पर्याप्त रूप से प्रदर्शित कर सकते हैं: सिंगल लाइन के साथ एक बैश स्क्रिप्ट बनाएं trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10। स्क्रिप्ट चलाएं और दो बार ctrl-C को हिट करें। आप देखेंगे कि दूसरे ctrl-C को "क्लीन अप" रूटीन (ट्रैप स्टेटमेंट में) पास किया गया है और इसकी sleepकमांड समाप्त हो गई है।
जॉन १०२४

1
@ जॉन १०२४ आह, अब मैं इसे देखता हूं। स्क्रिप्ट स्निपेट के लिए धन्यवाद ^ ^ लेकिन, क्लीनअप रद्द नहीं किया गया है देखें: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10यह केवल sleepकमांड्स हैं जो सिग्नल प्राप्त करते हैं। हम दोनों गलत xD थे
अराजकता

2
यह गलत है। सिग्नल डिलीवरी सिंक्रोनस है। यदि isigऑन है, जैसे ही CTRL-C दबाया जाता है और कर्नेल द्वारा प्राप्त किया जाता है (टर्मिनल एमुलेटर के लिए, जैसे ही टर्मिनल एमुलेटर इसे छद्म टर्मिनल के मास्टर साइड में लिखता है), SIGINT सिग्नल सभी को भेज दिया जाता है टर्मिनल के अग्रभूमि प्रक्रिया समूह में प्रक्रियाएं। इसे वहां अवरुद्ध किया जा सकता है, लेकिन इसे बाद में किसी अन्य प्रक्रिया में वितरित नहीं किया जाएगा। यहां तक ​​कि अगर टर्मिनल डिवाइस बफर भरा हुआ है (एप्लिकेशन ने आपके द्वारा टाइप की गई चीजों को नहीं पढ़ा है), CTRL-C कतार को कूद देगा।
स्टीफन चेज़लस

1
हां, एक उदाहरण के रूप में, वीएलसी अशुद्ध तरीके से छोड़ने के तरीके के रूप में कई Ctrl + C संकेतों की व्याख्या करता है, जबकि एक एकल Ctrl + C साफ़ छोड़ने का प्रयास करेगा।
जेरेमी विसर

11

आप उन्हें बर्बाद कर रहे हैं। यह सब होता है कि एक बार सर्वर स्क्रीन आउटपुट के साथ समाप्त हो जाता है, तो यह कई प्राप्त करेगा Ctrl-C। पहले एक का उपयोग प्रक्रिया को मारने के लिए किया जाएगा, और निम्नलिखित आपके शेल में समाप्त हो जाएंगे, जो तब कुछ ऐसा दिखेगा

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
यह जरूरी नहीं कि यह SIGINT भेजते समय प्रक्रिया से बाहर निकले। यह अनिश्चित काल तक जीवित रह सकता है और हर बार Ctrl + C दबाए जाने पर कुछ अलग कर सकता है।
ब्रायन गॉर्डन

सच। मैं इस बारे में धारणा बना रहा था कि उपयोगकर्ता फ़ाइल को कैसे पढ़ रहा है।
जेनी डी

5

संक्षिप्त उत्तर: यदि प्रक्रिया इस पर प्रतिक्रिया करती है।

दीर्घ उत्तर: जब आप हिट करते हैं ctrl+ cकर्नेल प्रक्रिया को संकेत भेजता है। निम्नलिखित कमांड द्वारा कौन सा संकेत निर्धारित किया जा सकता है:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

का मैन पेज देखें stty:

   intr CHAR
          CHAR will send an interrupt signal

यह सिग्नल है INT, जिसे नंबर 2 के रूप में भी जाना जाता है। जब प्रक्रिया में सिग्नल हैंडलर होता है तो यह इस पर प्रतिक्रिया कर सकता है। अधिकांश प्रक्रियाएं सफलतापूर्वक समाप्त होने के लिए कुछ सफाई कार्य करती हैं।


Ctrl-Z आमतौर पर SIGTSTP भेजता है जिसे संभाला जा सकता है (SIGSTOP के विपरीत)।
पेट्रफ

4
नहीं, यह वह शेल नहीं है जो SIGINT को प्रक्रिया में भेजता है। यह kernel(टर्मिनल, टर्मिनल ड्राइवर की लाइन अनुशासन) है जो टर्मिनल के अग्रभूमि प्रक्रिया समूह में हर प्रक्रिया को SIGINT भेजता है ।
स्टीफन चेज़लस

भविष्य के पाठक, unix.stackexchange.com/a/120071/135943 भी देखें ।
वाइल्डकार्ड

4

आप सही हे। कीप्स बर्बाद हो रहे हैं। जब आप दबाते हैं Crtl+Cऔर यह पता लगाया जाता है, तो ऐसे संसाधन हैं जिन्हें साफ करने की आवश्यकता है, यही कारण है कि इसमें समय लगता है। एक संभव मामला जिसे मैं जानता हूं कि दबाने Ctrl+Cकी आवश्यकता कहां है, जब आप एक यम अपडेट प्रक्रिया को रद्द करना चाहते हैं, जहां यम को आपको Ctrl+Cदो बार प्रेस करने की आवश्यकता होती है यह पुष्टि करने के लिए कि आप वास्तव में रद्द करना चाहते हैं।


2

हालांकि Ctrl-Cसामान्य मामले में केवल एक ही आवश्यक है, लेकिन कुछ स्थितियां ऐसी हैं जहां यह आवश्यक हो सकता है। उदाहरण के लिए, पायथन Ctrl-Cजब एक नया धागा पैदा करता है, तो फंस जाता है, और इसलिए यदि कई धागे शुरू करने के बीच में कुछ गलत हो जाता है, तो pythonमूल प्रक्रिया के माध्यम से इसे प्राप्त करने के लिए कई बार इसे फिर से शुरू करना आवश्यक होता है। पकड़े गए।


1
यह मेरे लिए अब और तब होता है जब मैं मल्टी-थ्रेडेड / प्रोसेस्ड पायथन स्क्रिप्ट बनाता हूं। मुख्य प्रक्रिया को मारने से पहले कभी-कभी कई प्रेस की आवश्यकता होती है।
लियो

0

मुझे हमेशाCtrlc कई बार प्रेस करना पड़ता है । मेरे पास पहले प्रेस पर इसका जवाब कभी नहीं था, और इसे कई बार उपयोग करना पड़ता है जब तक कि सिस्टम वास्तव में यह महसूस नहीं करता है Ctrlcकि भेजा जा रहा है। ऐसा लगता है जैसे यह वास्तव में याद आती है / उनमें से अधिकांश खो देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.