প্রক্রিয়াগুলি এগুলি চয়ন করতে পারে:
- সাধারণত সিগন্যাল সিগন্যালটিকে টিপে Ctrl-C(
trap '' INT
শেলের মতো) প্রেরণ করে এড়িয়ে যান বা এর জন্য তাদের নিজস্ব হ্যান্ডলার রয়েছে যা স্থির না করার সিদ্ধান্ত নেয় (বা সময়োপযোগী ফ্যাশনে শেষ করতে ব্যর্থ হয়)।
- টার্মিনাল ডিভাইসটি বলুন যে পূর্বের কাজটিতে একটি চিহ্নের জন্য যে অক্ষরটি প্রেরণ করা হয় তা হ'ল অন্য কিছু (
stty int '^K'
শেলের মতো)
- টার্মিনাল ডিভাইসটিকে কোনও সংকেত না পাঠাতে বলুন (
stty -isig
শেলের মতো)।
অথবা, এগুলি নিরবচ্ছিন্ন হতে পারে, যেমন কোনও সিস্টেম কলের মাঝামাঝি সময়ে যখন বাধা দেওয়া যায় না।
লিনাক্সে (তুলনামূলকভাবে সাম্প্রতিক কার্নেলের সাথে), আপনি বলতে পারেন যে কোনও প্রক্রিয়া আউটপুট দেখে সাইন ইনটিকে উপেক্ষা করছে এবং / অথবা পরিচালনা করছে কিনা
$ kill -l INT
2
$ grep Sig "/proc/$pid/status"
SigQ: 0/63858
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000002
SigCgt: 0000000000000000
উপরের সিগিনের দ্বিতীয় বিটটি 1, যার অর্থ SIGINT এড়ানো হবে।
আপনি এটি দিয়ে স্বয়ংক্রিয় করতে পারেন:
$ SIG=$(kill -l INT) perl -lane 'print $1 if $F[0] =~ /^Sig(...):/ &&
$F[1] & (1<<($ENV{SIG}-1))' < "/proc/$pid/status"
Ign
বর্তমান intr
অক্ষরটি কি তা isig
নির্দিষ্ট প্রদত্ত টার্মিনালের জন্য সক্ষম কিনা তা পরীক্ষা করতে :
$ stty -a < /dev/pts/0
[...] intr = ^C [...] isig
(উপরের intr
অক্ষরটি হ'ল ^C
(চাপলে CTRL-Cএবং ইনপুট সংকেতগুলি অক্ষম না করা অবস্থায় সাধারণত আপনার টার্মিনাল দ্বারা প্রেরিত অক্ষর (এমুলেটর)) অক্ষম থাকে।
$ stty -a < /dev/pts/1
[...] intr = ^K [...] -isig
( intr
চরিত্রটি ^K
এবং এর isig
জন্য অক্ষম /dev/pts/1
))
সম্পূর্ণতার জন্য, আরও দুটি উপায় আছে যেগুলি প্রক্রিয়া সাইন ইনগুলি পাওয়া বন্ধ করতে কিছু করতে পারে যদিও এটি আপনি সাধারণত দেখতে পাবে না।
এর পরে Ctrl+C, SIGINT সিগন্যালটি টার্মিনালের অগ্রভাগ প্রক্রিয়া গোষ্ঠীর সমস্ত প্রক্রিয়াতে প্রেরণ করা হয় । এটি সাধারণত শেল যে প্রক্রিয়া দলে দলে জায়গা প্রসেস (শেল ম্যাপ কাজ ) এবং টার্মিনাল ডিভাইস যা বলতে ফোরগ্রাউন্ড করুন।
এখন একটি প্রক্রিয়া পারে:
এর প্রক্রিয়া গ্রুপ ছেড়ে দিন। যদি এটি অন্য প্রক্রিয়া গোষ্ঠীতে স্থানান্তরিত হয় (যে কোনও প্রক্রিয়া গোষ্ঠী তবে সেই অগ্রভাগ এক) তবে এটি আর Ctrl-Cসাইনটটি পাবেন না (বা অন্যান্য কী-বোর্ড-সম্পর্কিত সিগন্যালগুলি যেমন SIGTSTP, SIGQUIT)। এটি টার্মিনাল ডিভাইস (পটভূমির প্রক্রিয়াগুলির মতো) থেকে পড়ার (সম্ভবত টার্মিনাল ডিভাইস সেটিংসের উপর নির্ভর করে লেখার চেষ্টা করা) চেষ্টা করলে এটি স্থগিত হয়ে যেতে পারে।
উদাহরণ হিসাবে:
perl -MPOSIX -e 'setpgid(0,getppid) or die "$!"; sleep 10'
সঙ্গে বাধা হতে পারে না Ctrl-C। উপরের perl
প্রসেস গ্রুপে যোগদানের চেষ্টা করবে যার আইডি এটির প্যারেন্ট প্রসেস আইডির সমান। সাধারণভাবে, এই আইডি সহ এমন একটি প্রক্রিয়া গ্রুপ থাকার কোনও গ্যারান্টি নেই। তবে এখানে, perl
একটি ইন্টারেক্টিভ শেলের প্রম্পটে সেই কমান্ডটি তার নিজেরাই চালিত হয়, পিপিড শেলের প্রক্রিয়া হবে এবং শেলটি সাধারণত নিজস্ব প্রক্রিয়া গোষ্ঠীতে শুরু করা হবে।
কমান্ডটি যদি ইতিমধ্যে কোনও প্রক্রিয়া গ্রুপের নেতা না হয় (সেই অগ্রভাগ প্রক্রিয়া গোষ্ঠীর নেতা), তবে এটি একটি নতুন প্রক্রিয়া গোষ্ঠী শুরু করা একই প্রভাব ফেলবে।
উদাহরণস্বরূপ, শেলের উপর নির্ভর করে,
$ ps -j >&2 | perl -MPOSIX -e 'setpgid(0,0) or die "$!"; sleep 10'
PID PGID SID TTY TIME CMD
21435 21435 21435 pts/12 00:00:00 zsh
21441 21441 21435 pts/12 00:00:00 ps
21442 21441 21435 pts/12 00:00:00 perl
একই প্রভাব আছে। ps
এবং perl
ফোরগ্রাউন্ড প্রক্রিয়া গ্রুপ শুরু হয়, কিন্তু বেশিরভাগ শেল উপর, ps
যা ওই দলের নেতা হতে হবে (যেমন দেখা ps
যেখানে উভয়ের pgid উপরে আউটপুট ps
এবং perl
এর PID হয় ps
), তাই perl
তার নিজস্ব প্রক্রিয়া গ্রুপ শুরু করতে পারেন।
অথবা এটি অগ্রভূমি প্রক্রিয়া গ্রুপ পরিবর্তন করতে পারে। মূলত tty ডিভাইসটিকে অন্য কোনও প্রক্রিয়া গোষ্ঠীতে সাইন ইন প্রেরণ করতে বলুনCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) বা মরা $ !; ঘুম 5 '
সেখানে, perl
একই প্রক্রিয়া গোষ্ঠীতে রয়ে গেছে তবে পরিবর্তে টার্মিনাল ডিভাইসটি জানিয়ে দিচ্ছে যে অগ্রভাগ প্রক্রিয়া গ্রুপটিই তার আইডি তার প্যারেন্ট প্রসেস আইডি হিসাবে একই (এটি সম্পর্কে উপরে নোট দেখুন)।
kill -9 %
এটি হত্যা করা। সিগন্যাল 9 উপেক্ষা করা যাবে না, বা স্থগিত সিগন্যালও দেওয়া যাবে না। সিটিআরএল + জেড কীবোর্ড সিকোয়েন্সটি তাত্ত্বিকভাবে উপেক্ষা করা যেতে পারে - তবে এটি বাস্তবে নেই।