কেন সিসি দিয়ে সম্পাদনা করা যাবে না?


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 এর আচরণকে ওভাররাইড করতে পারে।
jw013

4
এছাড়াও, কৌতুক
jw013

@ jw013 হ্যাঁ, "সাধারণ অধিবেশন" একটি রসিকতা ছিল (কোনও কারণে আমি এটিটি খুঁজে পাইনি) তবে আমার প্রশ্নটি গুরুতর। আমি যা বুঝতে পারি না তা হ'ল এই অ্যাপ্লিকেশনগুলি কেন Ctrl-C এর আচরণকে যদি কার্যকরভাবে কিছু সরবরাহ না করে তবে সেগুলি ওভাররাইড করতে পছন্দ করে।
লিলি চুং

1
যেহেতু এই প্রশ্নটি "কীভাবে এড থেকে প্রস্থান করবেন" শীর্ষস্থানীয় গুগল অনুসন্ধান উত্তর হিসাবে আসে, আমি এখানে যুক্ত করতে চাই যে এটি কেবল 'কিউ' এর পরে ফিরে আসবে। আমাদের কাছে এই তথ্য আনতে অনেক বোথান মারা গিয়েছিলেন।
দিমিত্রি

উত্তর:


19

Ctrl+ SIGINTC প্রেরণ করে । সিগিন্টের জন্য প্রচলিত ক্রিয়াটি হ'ল একটি প্রোগ্রামের শীর্ষ স্তরের লুপে ফিরে আসা, বর্তমান কমান্ডটি বাতিল করে এবং এমন একটি মোডে প্রবেশ করা যেখানে প্রোগ্রামটি পরবর্তী কমান্ডের জন্য অপেক্ষা করে। কেবলমাত্র অ-ইন্টারেক্টিভ প্রোগ্রামগুলিতে সাইন ইন থেকে মারা যাওয়ার কথা।

সুতরাং এটি স্বাভাবিক যে Ctrl+ Cএডকে হত্যা করে না, তবে এটিটিকে তার শীর্ষ স্তরের লুপে ফিরে আসে। Ctrl+ Cবর্তমান ইনপুট লাইনটি বাতিল করে এবং এড প্রম্পটে ফিরে আসে।

একই কম জন্য যায়: Ctrl+ + Cবিঘ্নিত বর্তমান কমান্ড এবং আপনি ফিরে তার কম্যান্ড প্রম্প্ট সম্পর্কে এনেছে।

Reasonsতিহাসিক কারণে, এড SIGQUIT ( Ctrl+ \) উপেক্ষা করে । সাধারণ অ্যাপ্লিকেশনগুলিকে এই সংকেতটি ধরা উচিত নয় এবং সক্ষম থাকলে একটি কোর ডাম্প সহ এগুলি নিজেরাই শেষ করে দেওয়া উচিত।


@ কেজকাই না, সাধারণ অ্যাপ্লিকেশনগুলিকে সিকুইট ধরা উচিত নয় , এটি জরুরি অবস্থা থেকে বেরিয়ে আসা হিসাবে বোঝানো হয়েছে।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

আহ, গোছা। ঠিক আছে, প্রত্যাহার।
Kzqai

18

ইউনিক্স V7 ed(1)সোর্স কোড মাত্র কয়েক মন্তব্য, এই অত্যন্ত জ্ঞানগর্ভ হেডার মন্তব্য যা এক সঙ্গে একটি আদিম 1,762-লাইন সি প্রোগ্রাম:

/*
 * Editor
 */

উত্স কোডটি নিজেই কোনও যুক্তি সরবরাহ করে না তা প্রদত্ত, আপনি কেবল প্রোগ্রামের লেখকের কাছ থেকে এটি পেতে চলেছেন।

edমূলত পিডিপি -11 অ্যাসেমব্লিতে কেন থম্পসন লিখেছিলেন , তবে আপনাকে প্রকৃত পক্ষে কথা বলতে হবে যারাই সিটিতে পোর্ট করেছিলেন তিনি ডেনিস রিচি হতে পারেন , যেহেতু তিনি ইউনিক্সের জন্য সি তৈরি করেছিলেন, এবং সি-কে ব্যবহার করেছিলেন এমন অনেকের মধ্যে একজন ছিলেন। ইউনিক্সকে নন-পিডিপি মেশিনে বহনযোগ্য করে তুলুন। ডাঃ রিচি এই ধরণের প্রশ্নের উত্তর দেওয়ার জন্য আর নেই।

আমার কোডটি পড়ার পরামর্শ দেয় যে এটি সম্পাদিত নথির ইন-কোর অনুলিপিটির বিষয়বস্তু চেষ্টা করার এবং সংরক্ষণ করার জন্য করা হয়েছিল । আপনি লক্ষ্য করবেন যে অন্যান্য পাঠ্য সম্পাদকরাও মারা যায় না Ctrl-C

এখানে কি edকরে Ctrl-C:

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

(হ্যাঁ, কেএন্ডআর সি । আমাদের কোনও স্টেনকিনের রিটার্ন টাইপ স্পেসিফায়ার বা পরামিতি ঘোষণার দরকার নেই))

ইংরেজী অনুবাদ ed,:

  1. সিগন্যাল হ্যান্ডলারের পুনরায় নিবন্ধন করুন।

    ( ১৯ix০ এর দশকের মাঝামাঝি সময়ে ইউনিক্স 4.3BSD পর্যন্ত স্বয়ংক্রিয়-পুনরায় সেট করার সংকেত পায়নি ))

  2. একটি নতুন লাইন লিখেছে, এবং মনে আছে যে এটি এটি করেছিল, বৈশ্বিক ভেরিয়েবলের মাধ্যমে lastc

    ( ed.cপ্রায় ষাট গ্লোবাল ভেরিয়েবল রয়েছে))

  3. error()ফাংশনটি কল করে , যা ব্যবহারকারীর দৃষ্টিকোণ থেকে বিখ্যাতভাবে মুদ্রণের চেয়ে কিছু বেশি করে ?

অন্য কথায়, এটি বলছে, "আপনি সত্যিই এটি করার অর্থ করেননি, তাই না?"


2
এছাড়াও লক্ষণীয় যে কন্ট্রোল সিটিতে প্রচুর পাঠ্য সম্পাদক প্রস্থান করে না। ভিমও দেয় না। ন্যানোও না। আমি মনে করি না ইমাকগুলি হয়, তবে এটি পরীক্ষার জন্য ইনস্টল করা নেই।
ডারোবার্ট ১

3
@डरবার্ট ভি সিএনটিএল + সি ইউনিক্সের সাথে আচরণ করে: শীর্ষস্থানে ফিরে যান। ইউনিক্সের অ-উত্সের কারণে ইমাসের নিজস্ব কী-বাইন্ডিং রয়েছে; ইউনিক্সের সিটিআরএল + সি এর সমতুল্য
ইমাকসটি হ'ল সিটিটিএল

@ডারবার্ট: ফেয়ার পয়েন্ট। আমি এটি উত্তরে যুক্ত করেছি।
ওয়ারেন ইয়ং

2
@ গিলস: কল করার error(s)ক্ষেত্রে অন্যতম পার্শ্ব প্রতিক্রিয়া ed.cহ'ল মূল প্রসেসিং লুপটিতে ফিরে আসা। এটি একটি longjmp()কল দিয়ে তাই না । কাঁপুন
ওয়ারেন ইয়ং

1
বিবরণ এবং ইতিহাস পাঠের জন্য আপনাকে ধন্যবাদ। এই ছিল একটি মহান পঠিত!
alichaudry

7

edঅন্যান্য ইন্টারেক্টিভ প্রোগ্রামগুলির মতো, প্রোগ্রামটির নিজস্ব কার্যাদি বাধা দেওয়ার জন্য Ctrl+ ব্যবহার করুন use এটি সাধারণ ক্ষেত্রে খুব অনুরূপ, যেখানে এটি শেলের মধ্যে চলমান কোনও কার্যকে বাধা দেয় - একটি কমান্ড।C

ব্যবহারকারীর দৃষ্টিকোণ থেকে উভয় রূপই খুব একই রকম very সিগন্যালের হ্যান্ডলিং পৃথক: সাধারণ ক্ষেত্রে, সিগন্যালটি SIGINTঅগ্রভাগ প্রক্রিয়াতে প্রেরণ করা হয়, একটি চলমান কমান্ড, এবং কমান্ডটি প্রস্থান করার মাধ্যমে পরিচালনা করে।
এর ক্ষেত্রে ed, সংকেতটি অগ্রভাগের প্রক্রিয়াতে, edউদাহরণ হিসাবে প্রেরণ করা হয় । যদি কোনও কাজ চলমান থাকে edতবে তা বাধাগ্রস্ত হয় এবং প্রম্পটটি প্রদর্শিত হয়। যদি কোনও কাজ চলমান না থাকে তবে কিছুই পরিবর্তন করা হয় না।

নোট কিভাবে শেল এছাড়াও দিকের প্রস্থান নয় Ctrl+ + Cশুধু মতো ed। এবং এটা দিকের প্রস্থান করে যে Ctrl+ + D। আবার, ঠিক মতed


3

তিনটি সংকেত রয়েছে যা edযত্ন করে:

  1. INT
  2. HUP
  3. QUIT

এর পসিক্স স্পেসিফিকেশনed এগুলি সম্পর্কে নিম্নলিখিত বলে:

SIGINT

edউপযোগ তার বর্তমান কার্যকলাপ সাময়িক বিরতি থাকবে স্ট্রিং লিখতে ?\nমানক আউটপুটে, এবং (এক্সটেন্ডেড বিবরণের বিভাগে দেখুন) কমান্ড মোডে ফিরে যান।

SIGHUP

যদি বাফারটি খালি না থাকে এবং শেষ রচনার পরে পরিবর্তিত হয়, edইউটিলিটি বাফারের একটি অনুলিপি একটি ফাইলে লেখার চেষ্টা করবে। প্রথমত, ed.hupবর্তমান ডিরেক্টরিতে নামের ফাইলটি ব্যবহার করা হবে; যদি এটি ব্যর্থ হয়, ed.hupডিরেক্টরি HOMEপরিবেশিত ভেরিয়েবল দ্বারা নামক ফাইল ব্যবহার করা হবে। যে কোনও ক্ষেত্রে, edইউটিলিটি ফাইলটি বর্তমানে মনে রাখা পাথনামে না লিখে এবং কমান্ড মোডে ফিরে না এসে প্রস্থান করবে।

SIGQUIT

edউপযোগ এই ইভেন্টটি উপেক্ষা করবে।

সুতরাং আপনার যে কোনও বাস্তবায়নই edব্যবহার করা হচ্ছে না কেন , এটি INTসিগন্যালের সাথে সম্মতিযুক্ত (যা Ctrl+Cপ্রেরণ করে) পসিক্স স্পেসিফিকেশনের সাথে খাপ খায় ।

এই ক্ষেত্রে, সম্পাদক একটি ইন্টারেক্টিভ শেলের মতো আচরণ করে, যা INTসংকেত পাওয়ার পরেও শেষ হয় না । যেমন অন্য সম্পাদকদের, viএবং nanoএকই জিনিস আছে।


1
কিছু প্রোগ্রাম বাস্তবায়ন ইচ্ছাকৃতভাবে পসিক্সের বিরোধিতা করে, তাই এই ক্ষেত্রে স্ট্যান্ডার্ড / এটি ভাঙার ব্যয়ের জন্য যুক্তিটি ব্যাখ্যা করা কার্যকর হতে পারে। stackoverflow.com/questions/38605463/...
sourcejedi

1
@ সোর্সজেদি মানক তার যুক্তিতে সিগন্যাল সম্পর্কে কিছু বলে না। আমি যে উত্স পেয়েছি তার উত্সে কেন মান অনুসরণ করা হয় সে সম্পর্কে কিছু বলার যৌক্তিকতা খুঁজে পাইনি ed। এটি শেলের মতো একইরকম আচরণ করে, যা INTসংকেত পাওয়ার পরেও শেষ হয় না ।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.