एड को Cc से क्यों नहीं निकाला जा सकता है?


20

कार्यक्रम ed, एक न्यूनतम पाठ संपादक का उपयोग कर के माध्यम से यह एक बाधा भेजकर बाहर निकल गया नहीं किया जा सकता Ctrl- C"?", बजाय त्रुटि संदेश मुद्रण सांत्वना देने के लिए। edजब यह रुकावट आती है तो सिर्फ बाहर क्यों नहीं निकलता? निश्चित रूप से कोई कारण नहीं है कि एक गुप्त त्रुटि संदेश सिर्फ बाहर निकलने की तुलना में यहां अधिक उपयोगी है। यह व्यवहार कई नए उपयोगकर्ताओं को निम्न प्रकार के इंटरैक्शन में ले जाता है:

$ ed
hello
?
help
?
exit
?
quit
?
^C
?
^C
?
?
?
^D
$ su
# rm -f /bin/ed

इस तरह के एक दुखद बर्बादी-आसानी से बचने योग्य अगर edबस बाधित होने के लिए सहमत हुए।

इसी तरह के व्यवहार को lessप्रदर्शित करने वाला एक और जिद्दी कार्यक्रम है, जिसकी अनदेखी करने का कोई कारण नहीं दिखता है C-c। ये कार्यक्रम सिर्फ संकेत क्यों नहीं देते?


4
इंटरएक्टिव एप्लिकेशन गैर-इंटरैक्टिव के समान नहीं हैं। आपके द्वारा उपयोग किया जाने वाला Ctrl-C व्यवहार गैर-संवादात्मक लोगों के लिए डिफ़ॉल्ट है। सहभागी अपने स्वयं के प्रयोजनों के लिए Ctrl-C के व्यवहार को ओवरराइड कर सकते हैं।
jw013

4
इसके अलावा, निश्चित नहीं है कि मजाक
jw013

@ jw013 हां, "विशिष्ट सत्र" एक मजाक था (मैं किसी कारण से ऐसा नहीं ढूंढ सका) लेकिन मेरा सवाल गंभीर है। मुझे समझ में नहीं आता है कि क्यों ये एप्लिकेशन Ctrl-C के व्यवहार को ओवरराइड करने के लिए चुनते हैं अगर यह वास्तव में कुछ भी उपयोगी नहीं प्रदान करता है।
लिली चुंग

1
चूँकि यह प्रश्न "कैसे बाहर निकलें एड" के लिए एक शीर्ष Google खोज उत्तर के रूप में आता है, मैं यहाँ जोड़ना चाहूंगा कि यह सिर्फ 'q' है और इसके बाद वापसी है। इस जानकारी को लाने के लिए कई बोधन की मृत्यु हुई।
दिमित्री

जवाबों:


19

Ctrl+ SIGINTC भेजता है । SIGINT के लिए पारंपरिक क्रिया एक प्रोग्राम के टॉपलेवल लूप पर लौटना है, वर्तमान कमांड को रद्द करना और एक मोड में प्रवेश करना है जहां प्रोग्राम अगले कमांड की प्रतीक्षा करता है। केवल गैर-संवादात्मक कार्यक्रम SIGINT से मरने वाले हैं।

तो यह स्वाभाविक है कि Ctrl+ Cएड को नहीं मारता है, लेकिन यह अपने टॉपवेल लूप में वापस आने का कारण बनता है। Ctrl+ Cवर्तमान इनपुट लाइन को निरस्त करता है और एड प्रॉम्प्ट पर लौटता है।

वही कम के लिए जाता है: Ctrl+ Cवर्तमान कमांड को बाधित करता है और आपको इसके कमांड प्रॉम्प्ट पर वापस लाता है।

ऐतिहासिक कारणों से, एड SIGQUIT ( Ctrl+ \) को अनदेखा करता है । सामान्य अनुप्रयोगों को इस संकेत को नहीं पकड़ना चाहिए और सक्षम होने पर कोर डंप के साथ खुद को समाप्त करने की अनुमति देना चाहिए।


@Kzqai नहीं, सामान्य अनुप्रयोगों को SIGQUIT को नहीं पकड़ना चाहिए , यह एक आपातकालीन निकास के रूप में है।
गिल्स एसओ- बुराई को रोकना '

आह, गच्चा। ठीक है, वापस ले लिया।
Kzqai

18

यूनिक्स V7 ed(1)स्रोत कोड बस कुछ टिप्पणियों, इस उच्च शिक्षाप्रद हैडर टिप्पणी है, जिनमें से एक के साथ एक आदिम 1,762 लाइन सी कार्यक्रम है:

/*
 * Editor
 */

यह देखते हुए कि स्रोत कोड स्वयं कोई तर्क प्रदान नहीं करता है, आप केवल इसे प्रोग्राम के लेखक से प्राप्त करने जा रहे हैं।

edमूल रूप से PD Thom-11 असेंबली में केन थॉम्पसन द्वारा लिखा गया था , लेकिन आपको वास्तव में सी पर पोर्ट करने वाले से बात करने की आवश्यकता होगी। वह डेनिस रिची हो सकता है , क्योंकि उसने यूनिक्स के लिए सी बनाया था, और सी का इस्तेमाल करने वाले कई लोगों में से एक था। गैर-पीडीपी मशीनों के लिए यूनिक्स को पोर्टेबल बनाएं। डॉ रिची अब इस तरह के सवालों के जवाब देने के लिए नहीं है।

कोड के मेरे पढ़ने से पता चलता है कि यह संपादित दस्तावेज़ की इन-कोर कॉपी की सामग्री को आज़माने और संरक्षित करने के लिए किया गया था । आप देखेंगे कि अन्य पाठ संपादक भी नहीं मरते हैं Ctrl-C

यहाँ क्या edहै Ctrl-C:

onintr()
{
    signal(SIGINT, onintr);
    putchr('\n');
    lastc = '\n';
    error(Q);
}

(हां, के एंड आर सी । हमें स्टीनकिन के रिटर्न प्रकार के निर्दिष्ट या पैरामीटर घोषणाओं की आवश्यकता नहीं है।)

अंग्रेजी में अनुवादित ed:

  1. सिग्नल हैंडलर को फिर से पंजीकृत करता है।

    (यूनिक्स को 1980 के दशक के मध्य में 4.3BSD तक ऑटो-रीसेटिंग सिग्नल नहीं मिला ।)

  2. एक नई लाइन लिखता है, और यह याद रखता है कि ऐसा उसने वैश्विक चर के माध्यम से किया था lastc

    ( ed.cलगभग साठ वैश्विक चर हैं।)

  3. error()फ़ंक्शन को कॉल करता है, जो प्रसिद्ध रूप से प्रिंट की तुलना में बहुत कम करता है ?, उपयोगकर्ता के दृष्टिकोण से।

दूसरे शब्दों में, यह कह रहा है, "आप वास्तव में ऐसा करने का मतलब नहीं था, क्या आपने?"


2
यह भी ध्यान देने योग्य है कि बहुत सारे टेक्स्ट एडिटर कंट्रोल-सी से बाहर नहीं निकलते हैं। विम भी नहीं करता है। न ही नैनो। मुझे नहीं लगता कि emacs करता है, या तो, लेकिन यह परीक्षण करने के लिए स्थापित नहीं है।
व्युत्पन्न

3
@derobert Vi, Ctrl + C को यूनिक्स तरीके से मानते हैं: toplevel पर वापस जाएं। गैर-यूनिक्स उत्पत्ति के कारण Emacs की अपनी कीबाइंडिंग है; यूनिक्स के Ctrl + C के बराबर Emacs Ctrl + G (घंटी का पात्र है - इसे रोकने के लिए कंप्यूटर पर घंटी
बजाएं

@derobert: उचित बिंदु। मैंने इसे उत्तर में जोड़ दिया है।
वारेन यंग

2
@Gilles: बुला के दुष्प्रभाव में से एक error(s)में ed.cमुख्य प्रसंस्करण पाश पर लौटने के लिए है। यह एक longjmp()कॉल के साथ ऐसा करता है । कंपकंपी
वॉरेन यंग

1
विवरण और इतिहास पाठ के लिए धन्यवाद। यह एक बढ़िया लेख था!
alichaudry

7

ed, अन्य इंटरैक्टिव कार्यक्रमों की तरह, प्रोग्राम के कार्यों को बाधित करने के लिए Ctrl+ Cका उपयोग करें ।
यह सामान्य मामले के समान है, जहां यह शेल में चलने वाले कार्य को बाधित करता है - एक कमांड।

उपयोगकर्ता के दृष्टिकोण से, दोनों प्रकार बहुत भिन्न हैं। सिग्नल की हैंडलिंग अलग होती है: सामान्य स्थिति में, सिग्नल SIGINTको अग्रभूमि प्रक्रिया, एक रनिंग कमांड को भेजा जाता है, और कमांड इसे बाहर निकाल कर हैंडल करता है।
के मामले में ed, संकेत अग्रभूमि प्रक्रिया, edउदाहरण के लिए भेजा जाता है । यदि कोई कार्य चल रहा है ed, तो उसे बाधित किया जाता है और संकेत दिखाया जाता है। यदि कोई कार्य नहीं चल रहा है, तो कुछ भी नहीं बदला जाता है।

ध्यान दें कि कैसे एक शेल भी Ctrl+ की Cतरह बाहर नहीं निकलता है ed। और यह Ctrl+ पर बाहर निकलें करता है D। फिर से, जैसेed


3

तीन संकेत हैं जो edपरवाह करते हैं:

  1. INT
  2. HUP
  3. QUIT

POSIX विनिर्देशed इन के बारे में निम्नलिखित कहता है:

SIGINT

edउपयोगिता अपने वर्तमान गतिविधि को बाधित करेगा, स्ट्रिंग लिखने ?\nमानक आउटपुट में, और (विस्तारित वर्णन अनुभाग देखें) आदेश मोड पर लौटने।

SIGHUP

यदि बफ़र खाली नहीं है और पिछले लिखने के बाद से बदल गया है, तो edउपयोगिता एक फ़ाइल में बफ़र की एक प्रति लिखने का प्रयास करेगी। सबसे पहले, ed.hupवर्तमान निर्देशिका में नामित फ़ाइल का उपयोग किया जाएगा; यदि वह विफल रहता है, ed.hupतो HOMEवातावरण चर नाम की निर्देशिका में नामित फ़ाइल का उपयोग किया जाएगा। किसी भी मामले में, edउपयोगिता वर्तमान में याद किए गए पथनाम के लिए फ़ाइल लिखे बिना और कमांड मोड में वापस आए बिना बाहर निकल जाएगी।

SIGQUIT

edउपयोगिता इस घटना की अनदेखी नहीं होगी।

तो आप जो भी कार्यान्वयन edकर रहे हैं, वह INTसिग्नल के संबंध में पॉसिक्स विनिर्देश के अनुरूप है (जो Ctrl+Cभेजता है)।

इस संबंध में, संपादक एक इंटरैक्टिव शेल की तरह व्यवहार करता है, जो INTसिग्नल प्राप्त करने पर भी समाप्त नहीं होता है । अन्य संपादक, जैसे कि viऔर nanoएक ही बात करते हैं।


1
कुछ कार्यक्रम कार्यान्वयन जानबूझकर POSIX का खंडन करते हैं, इसलिए मानक / इस मामले में इसे तोड़ने की लागत के लिए तर्क की व्याख्या करना उपयोगी हो सकता है। stackoverflow.com/questions/38605463/…
sourcejedi

1
@sourcejedi मानक अपने तर्क में संकेतों के बारे में कुछ नहीं कहता है। मुझे कोई औचित्य नहीं मिला है कि जो कुछ भी मेरे पास उपलब्ध है उसके स्रोतों में मानक का पालन क्यों किया जाता है, इसके बारे में कुछ भी नहीं कहा गया edहै। यह शेल के समान व्यवहार करता है, जो INTसिग्नल प्राप्त करने पर भी समाप्त नहीं होता है ।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.