প্রক্রিয়াগুলি তাদের পিতামাতাকে একটি প্রস্থান কোডের প্রতিবেদন করার জন্য একটি পূর্ণসংখ্যার যুক্তি সহ _exit()
সিস্টেম কল (লিনাক্সেও দেখুন exit_group()
) করতে পারে। এটি একটি পূর্ণসংখ্যা হলেও পিতামাতাদের কাছে কেবলমাত্র 8 টি কম গুরুত্বপূর্ণ বিট পাওয়া যায় ( লিনাক্সে না হলেও, কোডটি পুনরুদ্ধার করতে পিতামাতার মধ্যে SIGCHLD ব্যবহার করার সময় waitid()
বা হ্যান্ডলারটি ব্যতীত হয় )।
পিতামাতারা সাধারণত একটি পূর্ণসংখ্যা হিসাবে তাদের সন্তানের মর্যাদা পাওয়ার জন্য একটি করবেন wait()
বা যদিও কিছুটা ভিন্ন শব্দার্থবিজ্ঞানের পাশাপাশি এটি ব্যবহার করা যেতে পারে)।waitpid()
waitid()
লিনাক্স এবং বেশিরভাগ ইউনিসে, যদি প্রক্রিয়াটি সাধারণত শেষ হয়ে যায় তবে status স্থিতির নম্বরের 8 থেকে 15 বিটগুলিতে প্রস্থান হিসাবে প্রস্থান কোড থাকবে exit()
। যদি তা না হয় তবে 7 টি কমপক্ষে 7 টি গুরুত্বপূর্ণ বিট (0 থেকে 6) সিগন্যাল নম্বর ধারণ করবে এবং কোনও কোর ফেলে দেওয়া হলে বিট 7 সেট করা হবে।
perl
$?
উদাহরণস্বরূপ এর সেট অনুসারে সেই সংখ্যাটি রয়েছে waitpid()
:
$ perl -e 'system q(kill $$); printf "%04x\n", $?'
000f # killed by signal 15
$ perl -e 'system q(kill -ILL $$); printf "%04x\n", $?'
0084 # killed by signal 4 and core dumped
$ perl -e 'system q(exit $((0xabc))); printf "%04x\n", $?'
bc00 # terminated normally, 0xbc the lowest 8 bits of the status
বোর্নের মতো শেলগুলি তাদের চলকটিতে সর্বশেষ রান কমান্ডের প্রস্থান স্থিতি তৈরি করে $?
। তবে এটিতে সরাসরি ফিরে আসা সংখ্যাটি থাকে না, তবে এটির মধ্যে waitpid()
একটি রূপান্তর এবং এটি শাঁসের মধ্যে পৃথক।
সমস্ত শেলের মধ্যে যা সাধারণ তা হল প্রক্রিয়াটি স্বাভাবিকভাবে শেষ $?
হয়ে গেলে প্রস্থান কোডের সর্বনিম্ন 8 বিট থাকে (সংখ্যাটি পাস হয়েছে exit()
)।
প্রক্রিয়াটি যখন কোনও সিগন্যাল দ্বারা সমাপ্ত হয় তখন এটির ভিন্নতা কোথায়। সব ক্ষেত্রে, এবং এটি পসিক্স দ্বারা প্রয়োজনীয়, সংখ্যাটি 128 এর চেয়ে বেশি হবে P পসিক্স মানটি কী হতে পারে তা নির্দিষ্ট করে না। বাস্তবে যদিও, আমি জানি সকল বোর্নের মতো শেলগুলিতে, সর্বনিম্ন 7 বিটগুলিতে $?
সংকেত নম্বর থাকবে। কিন্তু, n
সিগন্যাল নম্বরটি কোথায় ,
ছাই, zsh, pdksh, বাশ, বোর্ন শেল, $?
হয় 128 + n
। কি যে মানে হল ঐ শাঁস মধ্যে, যদি আপনি একটি পেতে যে $?
এর 129
, আপনি কারণ প্রক্রিয়ার সঙ্গে থেকে প্রস্থান তা জানি না exit(129)
বা তা সংকেত দ্বারা হত্যা করা হয় 1
( HUP
সবচেয়ে সিস্টেমে)। তবে যুক্তিটি হ'ল শেলগুলি যখন তারা নিজেরাই বাইরে বের হয় তখন ডিফল্টরূপে শেষ প্রস্থান হওয়া কমান্ডের প্রস্থান স্থিতি ফিরে আসে। $?
এটি নিশ্চিত করে 255 এর চেয়ে বেশি কখনই বড় হয় না, যা ধারাবাহিকভাবে প্রস্থান স্থিতি করতে দেয়:
$ bash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
bash: line 1: 16720 Terminated sh -c "kill \$\$"
8f # 128 + 15
$ bash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
bash: line 1: 16726 Terminated sh -c "kill \$\$"
8f # here that 0x8f is from a exit(143) done by bash. Though it's
# not from a killed process, that does tell us that probably
# something was killed by a SIGTERM
ksh93
, $?
হয় 256 + n
। এর অর্থ হল যে আপনার একটি মূল্য থেকে একটি $?
নিহত এবং অ-নিহত প্রক্রিয়াটির মধ্যে পার্থক্য দেখাতে পারে। ksh
প্রস্থান করার $?
পরে আরও নতুন সংস্করণগুলি যদি 255 এর চেয়ে বেশি হয় তবে তার পিতামাতার কাছে একই প্রস্থান স্থিতির প্রতিবেদন করতে সক্ষম হওয়ার জন্য একই সংকেত দিয়ে নিজেকে হত্যা করে। যদিও এটি একটি ভাল ধারণার মতো শোনাচ্ছে, এর অর্থ এই যে ksh
কোনও উত্পন্ন উত্পন্ন সংকেত দ্বারা প্রক্রিয়াটি নিহত হলে একটি অতিরিক্ত কোর ডাম্প (সম্ভাব্যত অন্যটি ওভাররাইট করা) উত্পন্ন করবে:
$ ksh -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
ksh: 16828: Terminated
10f # 256 + 15
$ ksh -c 'sh -c "kill -ILL \$\$"; exit'; printf '%x\n' "$?"
ksh: 16816: Illegal instruction(coredump)
Illegal instruction(coredump)
104 # 256 + 15, ksh did indeed kill itself so as to report the same
# exit status as sh. Older versions of `ksh93` would have returned
# 4 instead.
আপনি এমনকি বলতে ksh93
পারেন যে কোনও বাগ রয়েছে তা হ'ল এটি কোনও ফাংশন দ্বারা সম্পন্ন হওয়া $?
থেকে এসেও নিজেকে হত্যা করে return 257
:
$ ksh -c 'f() { return "$1"; }; f 257; exit'
zsh: hangup ksh -c 'f() { return "$1"; }; f 257; exit'
# ksh kills itself with a SIGHUP so as to report a 257 exit status
# to its parent
yash
। yash
একটি আপোষ প্রস্তাব। এটি ফিরে আসে 256 + 128 + n
। এর অর্থ আমরা একটি নিহত প্রক্রিয়া এবং সঠিকভাবে সমাপ্ত হওয়া একটিতে পার্থক্য করতে পারি। এবং প্রস্থান করার পরে, এটি 128 + n
নিজেই আত্মহত্যা না করে এবং এর যে-পার্শ্ব প্রতিক্রিয়া হতে পারে তা জানিয়ে দেবে।
$ yash -c 'sh -c "kill \$\$"; printf "%x\n" "$?"'
18f # 256 + 128 + 15
$ yash -c 'sh -c "kill \$\$"; exit'; printf '%x\n' "$?"
8f # that's from a exit(143), yash was not killed
এর মান থেকে সংকেত পেতে $?
, পোর্টেবল উপায়টি হ'ল kill -l
:
$ /bin/kill 0
Terminated
$ kill -l "$?"
TERM
(বহনযোগ্যতার জন্য, আপনার কখনও সিগন্যাল নম্বর ব্যবহার করা উচিত নয়, কেবল সিগন্যালের নাম)
নন-বোর্ন ফ্রন্টে:
হয়তো সম্পূর্ণতার জন্য, আমরা উল্লেখ করা উচিত zsh
'র $pipestatus
এবং bash
এর $PIPESTATUS
অ্যারে যে গত পাইপলাইন উপাদানের প্রস্থান অবস্থা ধারণ করে।
এবং সম্পূর্ণতার জন্য, যখন শেল ফাংশন এবং উত্সযুক্ত ফাইলগুলির কথা আসে, তখন ডিফল্ট ফাংশনগুলি শেষ কমান্ডের প্রস্থান স্থিতি দিয়ে ফিরে আসে, তবে return
বিল্টিনের সাথে স্পষ্টভাবে একটি রিটার্নের স্থিতিও সেট করতে পারে । এবং আমরা কিছু পার্থক্য এখানে দেখুন:
bash
এবং mksh
(আর 41 সাল থেকে, একটি রিগ্রেশন ^ বিনিময় দৃশ্যত ইচ্ছাকৃতভাবে পরিচয় করিয়ে দেওয়া ) সংখ্যাটি (ধনাত্মক বা নেতিবাচক) কে 8 বিট করে কেটে দেবে। সুতরাং উদাহরণস্বরূপ return 1234
সেট $?
করা হবে 210
, 255 return -- -1
সেট $?
করা হবে ।
zsh
এবং pdksh
(এবং ব্যতীত অন্যান্য ডেরাইভেটিভস mksh
) যেকোন স্বাক্ষরিত 32 বিট দশমিক পূর্ণসংখ্যার (-2 31 থেকে 2 31 -1) (এবং সংখ্যাটি 32 বিটের মধ্যে ছাঁটাই করে) অনুমতি দেয়।
ash
এবং yash
0 থেকে 2 31 -1 পর্যন্ত কোনও ধনাত্মক পূর্ণসংখ্যার মঞ্জুরি দিন এবং এর বাইরে যে কোনও সংখ্যার জন্য ত্রুটি ফিরিয়ে দিন।
ksh93
জন্য return 0
করতে return 320
সেট $?
যেমন আছে, কিন্তু অন্য কিছু জন্য, 8 বিট অগ্রভাগ ছাঁটিয়া। ইতিমধ্যে উল্লিখিত হিসাবে সাবধান থাকুন যে 256 এবং 320 এর মধ্যে একটি নম্বর ফিরে আসা ksh
প্রস্থান করার সময় নিজেকে হত্যা করতে পারে ।
rc
এবং es
কিছু এমনকি তালিকা ফেরত অনুমতি দিন।
এছাড়াও মনে রাখবেন যে কিছু শাঁস এছাড়াও বিশেষ মান ব্যবহার $?
/ $status
কিছু ত্রুটি অবস্থার একটি প্রক্রিয়ার প্রস্থান অবস্থা নয়, মত প্রতিবেদন করতে 127
বা 126
জন্য পাওয়া যায়নি কমান্ড বা এক্সিকিউটেবল (ক sourced ফাইলে বা বাক্য গঠন ত্রুটি) ...
killall myScript
কাজ, অত: পর ফিরতি জন্য killall এর (এবং স্ক্রিপ্ট নয়!) হয় 0. আপনি একটি জায়গা পারেkill -x $$
[সংকেত সংখ্যা হচ্ছে এক্স, এবং $$ সাধারণত স্ক্রিপ্টের PID, শেল দ্বারা প্রসারিত (SH কাজ করে ব্যাশ, ...)] স্ক্রিপ্টের ভিতরে এবং তারপরে এটির প্রস্থান কোরটি পরীক্ষা করে।