কেন Ctrl-C টার্মিনাল নিজেই মেরে না?


39

টার্মিনালটি যখন আমরা এটি খুলব তখন চলছে।

luvpreet@DHARI-Inspiron-3542:/$

আমি সবেমাত্র এটি খুললাম। সুতরাং, যখন আমি Ctrl+ টিপব, তখন Cকেন এটি নিজেকে মেরে না এবং টার্মিনালটি বন্ধ করে দেয় ??


21
টার্মিনালটি টার্মিনালে চলছে না ;-)
পাইলট

3
নিয়ন্ত্রণ-ডি কেন কাজ করে তা সম্পর্কিত: unix.stackexchange.com/a/110248/14305
জানুস

উত্তর:


48

Ctrl+ Cহ'ল বাধা সংকেত। আপনি যখন এটি কোনও টার্মিনালে টাইপ করেন, তখন ব্যাশ অগ্রভাগের জবটিতে SIGINT প্রেরণ করে। যদি কোনও কাজ না থাকে (আপনি যখন কেবলমাত্র একটি টার্মিনাল খোলেন তখন এটিই ঘটে) তবে কিছুই ঘটে না। টার্মিনাল এমুলেটর প্রোগ্রামটি শেলের মধ্যে চলছে এমন কোনও কাজ নয়, সুতরাং এটি সিগন্যাল পায় না এবং বন্ধ হয় না।

আপনি যদি একটি নিয়ন্ত্রণ কী দিয়ে টার্মিনালটি বন্ধ করতে চান তবে Ctrl+ D(EOF) ব্যবহার করুন যার ফলে ব্যাশ প্রস্থান করতে পারে (এবং টার্মিনালটিও বন্ধ করে দেয়)।

আরও দেখুন: সিগন্যালগুলিতে বাশ বিগিনিয়ার গাইড এবং আরও গভীরতায় সিগন্যাল হ্যান্ডলিং কীভাবে কাজ করে তা
দ্রষ্টব্য: মন্তব্য পোস্ট হওয়ার পরে এই উত্তরটি সম্পাদনা করা হয়েছে


4
সঠিক শব্দটি হ'ল শেল সংকেতটিকে "ফাঁদে ফেলবে"। আপনি যখন অন্য উইন্ডো থেকে একটি টার্মিনাল উইন্ডো চালু করেন তখন আলাদা গল্প হয়। প্যারেন্ট উইন্ডোতে সিআরটিএল + সি পাঠানো শিশু প্রক্রিয়াটি হারাবে।
সের্গেই কোলোডিয়াজনি

1
এছাড়াও, জিইউআই উইন্ডোগুলিকে এক্স 11 সার্ভার থেকে আসা নির্দিষ্ট সংকেতগুলি আটকাতে নির্দেশ দেওয়া যেতে পারে। এভাবেই আপনি সংরক্ষণযোগ্য কাজের বিষয়ে আপনাকে পপআপগুলি অবহিত করতে বা ব্রাউজারগুলির মতো ট্যাবগুলি খুলতে পারেন
সের্গি কলডিয়াজহনি

8
@ ক্রাইলিস টার্মিনাল প্রোগ্রামটি কেবলমাত্র ctrl-c অক্ষর প্রেরণ করে, এটি আসলে কার্নেল টিটি স্তর যা এটি সিগন্যালে রূপান্তরিত করে।
র্যান্ডম 832

3
@ ক্রাইলিস: এবং টার্মিনাল, বা এর ভিতরে চলমান একটি প্রোগ্রাম - উদাহরণস্বরূপ একটি পাঠ্য সম্পাদক - অন্য কোনও ক্রিয়ায় ভালভাবে সিটিএল-সি অনুবাদ করতে পারে।
জামেস্কেফ

3
bashসিটিআরএল-সি টিপে যখন কোনও প্রোগ্রাম বন্ধ করা হবে বলে আমি মনে করি না । এটি কেবল কার্নেলটিকে জানাবে যে কোন প্রসেস গ্রুপটি সক্রিয় এবং কার্নেল যখন টার্মিনাল প্রোগ্রাম থেকে ctrl-c প্রাপ্ত করবে তখন সেই প্রক্রিয়া গোষ্ঠীতে একটি সংকেত তৈরি করবে।
ক্যাস্পারড

32

^Cকীস্ট্রোক, অন্যান্য কীস্ট্রোকগুলি মত *, যাদু নয় - এটি একটি keycode যেটা প্রোগ্রাম ফোকাস আছে পাঠায়। (এক্স-তে, C0x4 এর জন্য একটি সংশোধক সহ কীকোড 54 টি Ctrlkeys

যখন কোনও জিইউআই টার্মিনাল এমুলেটর (যেমন, কনসোল) বা ভার্চুয়াল টার্মিনাল একটি কীস্ট্রোক গ্রহণ করে যার দ্বারা এটি ব্যাখ্যা করে ^C, এটি তিনটি জিনিসের মধ্যে একটি করতে পারে। যদি টার্মিনালটি কাঁচা মোডে থাকে , তবে চলমান প্রোগ্রামটি টার্মিনালকে বিশেষ কীগুলির কোনও হ্যান্ডলিং নিজেই সম্পাদন না করার এবং সরাসরি প্রোগ্রামে তাদের পাস করার জন্য বলেছে । কিছু প্রোগ্রাম যা লাইন সম্পাদনার মতো উন্নত বৈশিষ্ট্যগুলিকে সমর্থন করে তারা সম্পূর্ণ কাঁচা কীস্ট্রোক এবং প্রক্রিয়াকৃত পাঠ্যের লাইনের মধ্যে কিছু কনফিগারেশনে কীবোর্ড ইনপুট পান; bashউদাহরণস্বরূপ, একবারে একটি করে কীস্ট্রোক গ্রহণ করা হয়। ^Cটার্মিনাল দ্বারা ব্যাখ্যা করা হয়, তবে ব্যাকস্পেস কীটি শেলকে যেমন হয় তেমন প্রেরণ করা হয়।

তবে বেশিরভাগ প্রোগ্রাম রান্না করা মোড ব্যবহার করে (কারণ এটি কাঁচা নয়), যেখানে টার্মিনালটি প্রোগ্রামে আসলে পাঠানোর আগে কিছু বেসিক কীস্ট্রোককে ব্যাখ্যা করে (এজন্য আপনি ব্যাকস্পেস ব্যবহার করতে পারেন cat)। এই মোডে, টার্মিনাল নিজেই ^Cকীস্ট্রোকটিকে একটি SIGINTসিগন্যালে অনুবাদ করে এবং এটি শিশু প্রক্রিয়াতে প্রেরণ করে। যেহেতু টার্মিনালটি সিগন্যাল তৈরি করেছে, এটি বিভ্রান্ত হবে না এবং শেষ হবে না।

  • SysRq সত্যিই যাদু।

স্পষ্টতই এখানে সুপার-প্রাসঙ্গিক নয়, তবে সাধারণ কম্পিউটিংয়ের জন্য আরও বেশি ম্যাজিক কীস্ট্রোক রয়েছে। সর্বাধিক বিখ্যাত, উইন্ডোজ জগতে , Ctrl+ Alt+ Deleteযেখানে মূল সংমিশ্রণটি যাদুবিদ্যার খুব কাছাকাছি রয়েছে (এটি উইন্ডোজকে কাজ করার জন্য ব্যবহার করা যেতে পারে, এটি নিজের মধ্যে বেশ মায়াবী!), যেহেতু এটি সিস্টেমে বাধা দেওয়ার জন্য কঠোরভাবে কোডড রয়েছে এবং বেশ কিছুটা ওভাররাইড করে — SysRqএই অর্থে বেশ সমান ।
কেআরয়ান

7
বাশ কাঁচা মোড ব্যবহার করে না - এটি ক্যারেক্টার-এ-এ-টাইম মোড অর্থাৎ cbreak/ ব্যবহার করে -icanon, তবে এটি isigমোড সেটটি ছেড়ে যায় না এবং আপনি যখন তাদের সাথে ম্যাপ করা কীগুলি টিপেন তখন আসল সংকেত পাওয়া যায়। SIGINTআপনার বর্ণনার সাথে আচরণ করে এটি পরিচালনা করে (এটি কেবল লাইন সম্পাদনা বাতিল করে না, এটি কোনও অভ্যন্তরীণ কমান্ডও বাতিল করতে পারে যা লুপে চলছে), এবং সম্পূর্ণ উপেক্ষা করে SIGTSTPএবং SIGQUIT। অন্যান্য প্রোগ্রাম, যেমন vi, নাও পারে।
র্যান্ডম 832

1
@KRyan Ctrl+ + Alt+ + Deleteআরও বেশি জাদু তুলনায় এটি আজ ব্যবহার করা হয় - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 । যদিও আমি মনের দিক থেকে লিনাক্সের একজন ব্যক্তি, যদিও উইন্ডোজ প্রথমদিকে এমন সীমিত সংস্থাগুলি দিয়ে বিষয়গুলিকে ব্যবহারকারী-বান্ধব এবং যৌক্তিক করে তুলতে পেরেছি বলে আমি প্রায়শই যথেষ্ট বিস্মিত হই।
মুজার

কিছু ওএসের ক্ষেত্রে, এমনকি যদি অন্য কোনও প্রোগ্রামটিতে সিস্টেমটি ফোকাস করে (উইন্ডো ম্যানেজার আমি অনুমান করি?) টার্মিনাল এমুলেটরটি আগে কখনও করার আগে কিপ্রেসগুলি পায়। আপনি যদি উইন্ডো স্ন্যাপ করতে কীবোর্ড শর্টকাটগুলি কনফিগার করতে সক্ষম হন, অ্যাপ্লিকেশনগুলি খুলুন, ট্রিগার স্ক্রিপ্টগুলি চাপুন কীগুলি টিমিনাল এমুলেটরে প্রেরণের আগে তারা আপনাকে কনফিগার করা কোনও শর্টকাটের জন্য পরীক্ষা করা হবে। এবং আর একটি উদাহরণ যদি আপনার কাছে অ্যাপ্লিকেশন খোলা ^cনা থাকে তবে উইন্ডো ম্যানেজারটিকে হত্যা করবে না :)। এক সময় স্টাফগুলিতে কাঁচা / রান্না করা চরিত্রের বিষয়ে মন্তব্য করতে সক্ষম হচ্ছি না, তবে কী-স্ট্রোকটি কীভাবে উত্পাদিত হচ্ছে সে সম্পর্কে উত্তরটি পাওয়া যায়SIGINT
অজয়

2
" রান্না করা মোড (কারণ এটি কাঁচা নয়)": আমি ... বাকরুদ্ধ। এত বছর পরেও আমি কখনও এই সংযোগটি করি নি।
ইসানায়ে

8

^Cসাধারণত সিগন্যালে ম্যাপ stty -aকরা হয় SIGINT(দেখুন man 7 signal)।

আন-ক্যাচড SIGINTচলমান প্রক্রিয়াটিকে বাধা দেয়, তবে ...

SIGINT এমন একটি সংকেত যা কোনও প্রক্রিয়া ("একটি সংকেত ধরা") এর জন্য আচরণ নির্দিষ্ট করতে পারে।

আপনি যাকে "টার্মিনাল" বলছেন তা ক্যাচ করে SIGINTএবং কাজে ফিরে যায়।


7

আমি যখন প্রথম ছিলাম তখন আমি সেই অংশটি অনুভব করছিলাম যে আমি যখন কমান্ড লাইনটি ব্যবহার করছিলাম তখন আমি দুটি পৃথক প্রোগ্রাম, টার্মিনাল এবং একটি শেল ব্যবহার করছিলাম (যেমন বাশ)

শেলটি হ'ল এটি আপনি সম্ভবত জানেন যা একটি প্রোগ্রাম যা ইনপুট কমান্ড বা স্ক্রিপ্ট হিসাবে নেয়, তাদের চালায় এবং তাদের আউটপুট প্রিন্ট করে।

অন্য পাশের টার্মিনালটি ব্যবহারকারী এবং একটি প্রোগ্রামের (মাঝামাঝি কোনও প্রোগ্রাম যা সাধারণত বাশ বা মাছের মতো একটি শেল) এর মাঝখানে মানুষের মতো like টার্মিনালটি যা করে তা হ'ল উদাহরণস্বরূপ কীবোর্ড থেকে ইনপুটটি পড়া, সম্ভবত কোনও উপায়ে সেই ইনপুটটি প্রক্রিয়াকরণ করা এবং এটি অন্য প্রোগ্রামে (বাশ) পুনর্নির্দেশ করা।

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

উদাহরণস্বরূপ যদি কোনও প্রোগ্রাম নিম্নলিখিত ক্রমটি ছাড়িয়ে যায়:

\e[0;31m some extra foobar text

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

একইভাবে যখন ব্যবহারকারী টিপায় Ctrl - C, এ সম্পর্কিত একমাত্র বিশেষ জিনিসটি হল টার্মিনালটি এটি একটি বিশেষ উপায়ে চিকিত্সা করতে বেছে নেয়, এই কী অনুক্রমের সাথে বিশেষ কিছু নেই। বিশেষত এটি এটি ইঙ্গিত দেয় যে টার্মিনালের অভ্যন্তরে যে প্রক্রিয়াটি চলছে সেগুলিতে বিঘ্নিত সংকেত (SIGINT) প্রেরণ করার জন্য, এটি শেল। যদি সেই মুহুর্তে শেল দ্বারা উদ্ভূত এবং বর্তমানে অগ্রভাগে চলমান কোনও প্রোগ্রাম উপস্থিত থাকে তবে এটি সংকেতও গ্রহণ করে receives এখন শেলটির এই সংকেতটির জন্য একটি বিশেষ হ্যান্ডলার রয়েছে এবং কিছুই ঘটে না। তবে বেশিরভাগ প্রোগ্রামের ডিফল্ট হ্যান্ডলার থাকে যা সাইন্টের ক্ষেত্রে সবেমাত্র প্রস্থান করে।


5

প্রতিটি সংকেতের সাথে এর সাথে যুক্ত একটি ডিফল্ট ক্রিয়া থাকে। কোনও সিগন্যালের জন্য ডিফল্ট ক্রিয়া হ'ল কোনও স্ক্রিপ্ট বা প্রোগ্রাম যখন সংকেত পায় তখন সম্পাদন করে।

Ctrl+ C"বিঘ্নিত" সিগন্যাল ( সিগিন্ট ) প্রেরণ করে , যা অগ্রভাগে চলমান কাজের ক্ষেত্রে প্রক্রিয়াটি সমাপ্ত করতে ডিফল্ট।

Ctrl+ Dটার্মিনালকে বলে যে এটি স্ট্যান্ডার্ড ইনপুটটিতে একটি EOF নিবন্ধিত করা উচিত , যা ব্যাশটি প্রস্থান করার ইচ্ছা হিসাবে ব্যাখ্যা করে ।

কোনও প্রক্রিয়া INT সিগন্যালটিকে উপেক্ষা করতে পছন্দ করতে পারে এবং বাশ এটি করতে পারে যখন এটি ইন্টারেক্টিভ মোডে চলছে।

ম্যানুয়াল থেকে :

যখন বাশ ইন্টারেক্টিভ হয়, কোনও ফাঁদের অভাবে, এটি SIGTERM উপেক্ষা করে (যাতে 0 টি হত্যা একটি ইন্টারেক্টিভ শেলকে হত্যা করে না), এবং সাইন ইনটি ধরা পড়ে এবং পরিচালনা করা হয় (যাতে অপেক্ষা বিল্টিন বাধা দেওয়া যায়)। সব ক্ষেত্রেই বাশ স্যুইকুইটকে উপেক্ষা করে। যদি জব নিয়ন্ত্রণ কার্যকর হয়, তবে ব্যাশ সিগটিন, সিগটো এবং সিগস্টটপ উপেক্ষা করে।


ফাঁদ দিয়ে এটি বুঝতে :

ট্র্যাপ শেলটিতে নির্মিত একটি ফাংশন যা হার্ডওয়্যার সিগন্যাল এবং অন্যান্য ইভেন্টগুলিতে সাড়া দেয়। শেল সংকেত বা অন্যান্য বিশেষ শর্তগুলি গ্রহণ করলে এটি পরিচালনা করতে পরিচালিত সংস্থাগুলিকে সংজ্ঞায়িত ও সক্রিয় করে।

trap [-lp] [arg] [sigspec …]

-l সিগন্যালের নাম এবং তাদের সম্পর্কিত নম্বরগুলির একটি তালিকা মুদ্রণ করুন।
-pপ্রতিটি SIGNAL_SPEC এর সাথে সম্পর্কিত ট্র্যাপ কমান্ডগুলি প্রদর্শন করুন।

শেল সংকেত সিগস্পেক পেলে আরগটি পড়তে হবে এবং সম্পাদন করতে হয়। প্রতিটি সিগস্পেক হয় সিগন্যালের নাম বা সিগন্যাল নম্বর। সিগন্যাল নামগুলি সংবেদনশীল এবং SIG উপসর্গ optionচ্ছিক।

একটি এমন sigspec হয় 0 বা প্রস্থান করুন , ARG মৃত্যুদন্ড কার্যকর হয় যখন শেল প্রস্থান করে। এটি বুঝতে, টার্মিনালটি বন্ধ করুন এবং .bashrcফাইলে নিম্নলিখিত লাইনটি সম্পাদনা করার পরে এটি খুলুন ।

trap 'notify-send "Ctrl D pressed"' 0

exitটার্মিনাল থেকে প্রস্থান করার জন্য Ctrl D কমান্ডের অনুরূপ ।

যদি আপনি চান বা আইএনটি সিগন্যালটি পেয়েও প্রস্থান করতে চান, এমনকি ইন্টারেক্টিভ মোডেও, আপনি নিম্নলিখিতটি আপনারটিতে যুক্ত করতে পারেন ~/.bashrc:

trap 'exit' INT

অথবা

trap 'exit' 2

1
এটা বৈধ মনে হচ্ছে !!
luv.prit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.