সংখ্যা প্রেরণ _exit()
/ exit_group()
সিস্টেম কল (কখনও কখনও বলা প্রস্থান কোড সঙ্গে অস্পষ্টতা এড়াতে প্রস্থান অবস্থা যা পারেন প্রস্থান কোড বা সংকেত নম্বর এবং অতিরিক্ত তথ্য উপর নির্ভর করে একজন এনকোডিং উল্লেখ করা হয় প্রক্রিয়া নষ্ট হয়েছে বা স্বাভাবিকভাবে থেকে প্রস্থান ছিল কিনা ) প্রকারভেদে int
, তাই লিনাক্সের মতো ইউনিক্সের মতো সিস্টেমগুলিতে, সাধারণত -2147483648 (-2 31 ) থেকে 2147483647 (2 31 -1) এর মান সহ 32 বীট পূর্ণসংখ্যা হয় ।
যাইহোক, সব সিস্টেমে, যখন পিতা বা মাতা প্রক্রিয়া (বা শিশু subreaper বা init
যদি পিতা বা মাতা মারা যান) ব্যবহার করে wait()
, waitpid()
, wait3()
, wait4()
সিস্টেম কল এটি পুনরুদ্ধার করতে, শুধুমাত্র এটা নিচের 8 বিট উপলব্ধ (মান 0 255 (2 করছে 8 - 1))।
waitid()
বেশিরভাগ সিস্টেমে (এবং সিএসসিএইচএলডি-তে সিগন্যাল হ্যান্ডলার) ব্যবহার করার সময় (এবং পসিক্স হিসাবে এখন স্ট্যান্ডার্ডের 2016 সংস্করণে আরও স্পষ্টভাবে প্রয়োজন ( _exit()
স্পেসিফিকেশন দেখুন )), পুরো সংখ্যা উপলব্ধ ( si_status
ফিরে আসা কাঠামোর ক্ষেত্রে) )। লিনাক্সে এখনও এটি waitid()
ঘটেনি যদিও এটি API এর সাথে সংখ্যাটি 8 বিটে ছাড়ে, যদিও ভবিষ্যতে এটি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে।
সাধারণত, আপনি কেবলমাত্র 0 টির (সাধারণত সাফল্যের অর্থ) 125 টির জন্য ব্যবহার করতে চান, কারণ অনেকগুলি শেলগুলি প্রস্থান হওয়ার স্থিতিটির$?
উপস্থাপনে 128 এর উপরে মানগুলি ব্যবহার করা হয় এবং বিশেষত 126 এবং 127 প্রক্রিয়াটির সংকেত নম্বরটি এনকোড করতে ব্যবহার করে শর্ত।
exit()
শেলটির জন্য যেমন করা হয় তেমন একই জিনিসটি বোঝাতে আপনি 126 থেকে 255 টি ব্যবহার করতে চাইতে পারেন $?
(যেমন কোনও স্ক্রিপ্ট যখন করে ret=$?; ...; exit "$ret"
)। 0 -> 255 এর বাইরে মান ব্যবহার করা সাধারণত কার্যকর হয় না। আপনি কেবলমাত্র এমনটি করতেন যে আপনি যদি জানেন যে পিতামাতারা waitid()
এমন সিস্টেমগুলিতে API ব্যবহার করবেন যা ছাঁটা হয় না এবং আপনার 32 বিট মানের প্রয়োজন হয়। নোট করুন যে আপনি exit(2048)
উদাহরণস্বরূপ যদি কিছু করেন তবে এটি পিতামাতার দ্বারা success wait*()
তিহ্যবাহী API গুলি ব্যবহার করে সাফল্য হিসাবে দেখা যাবে ।
আরও তথ্য এখানে:
এই প্রশ্নোত্তর আশা করা উচিত আপনার বেশিরভাগ অন্যান্য প্রশ্নের উত্তর দেওয়া উচিত এবং প্রস্থান স্থিতি বলতে কী বোঝানো হয়েছে তা পরিষ্কার করে দেওয়া উচিত । আমি আরও কয়েকটি জিনিস যুক্ত করব:
কোনও প্রক্রিয়া মারা না যাওয়া বা _exit()
/ exit_group()
সিস্টেম কলগুলিকে কল না করা পর্যন্ত এটি শেষ করতে পারে না । আপনার কাছ থেকে আসতে যখন main()
মধ্যে C
, libc কল ফেরত মান সঙ্গে সিস্টেম কল।
বেশিরভাগ ভাষায় একটি exit()
ফাংশন থাকে যা সেই সিস্টেম কলটি আবৃত করে এবং তারা যে মানটি নেয় সেগুলি যদি সিস্টেম কলের মতো সাধারণত পাস করা হয়। (মনে রাখবেন যে এগুলি সাধারণত সি এর exit()
ফাংশন দ্বারা পরিচ্ছন্নতার মতো আরও কাজ করে যা স্ট্ডিও বাফারগুলিকে ফ্লাশ করে, atexit()
হুক চালায় ...)
এটি অন্তত:
$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234) = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234) = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234) = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)
আপনি মাঝে মাঝে এমন কয়েকজনকে দেখতে পান যে আপনি 0-255 এর বাইরে কোনও মান ব্যবহার করার সময় অভিযোগ করেন:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
যখন আপনি একটি নেতিবাচক মান ব্যবহার করেন কিছু শেল অভিযোগ করে:
$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2) = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2) = ?
exit
বিশেষ বিল্টিনে দেওয়া মান 0-> 255 এর বাইরে থাকলে পসিক্স আচরণটিকে অপরিজ্ঞাত করে দেয়।
কিছু শেল কিছু অপ্রত্যাশিত আচরণ দেখায় যদি আপনি তা করেন:
bash
(এবং mksh
তবে pdksh
এটির ভিত্তিতে নয়) 8 টি বিটের মান কেটে নেওয়ার জন্য নিজেকে নিয়ে যায়:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
সুতরাং এই শেলগুলিতে, আপনি যদি 0-255 এর বাইরে কোনও মান দিয়ে প্রস্থান করতে চান তবে আপনাকে কিছু করতে হবে:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
এটি একই প্রক্রিয়াতে আরেকটি কমান্ড কার্যকর করে যা আপনার পছন্দের মানের সাথে সিস্টেম কলকে কল করতে পারে।
যেমনটি অন্যান্য প্রশ্নোত্তরে উল্লিখিত হয়েছে, ksh93
257 থেকে 256 + সর্বোচ্চ_সাইনাল_ নাম্বার পর্যন্ত প্রস্থান মূল্যগুলির জন্য সবচেয়ে অদ্ভুত আচরণ রয়েছে যেখানে কল করার পরিবর্তে exit_group()
এটি নিজেকে সম্পর্কিত সংকেত দিয়ে হত্যা করে ¹
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
এবং অন্যথায় bash
/ এর মতো সংখ্যা কেটে দেয় mksh
।
¹ যদিও এটি পরবর্তী সংস্করণে পরিবর্তিত হতে পারে। এটিটির উন্নয়নের বিষয়টি ksh93
এটিএন্ডটিটির বাইরে একটি সম্প্রদায়ের প্রচেষ্টা হিসাবে গ্রহণ করা হয়েছে , পসিক্স দ্বারা কোনওরকম উত্সাহিত করা সত্ত্বেও , সেই আচরণটি ফিরিয়ে দেওয়া হচ্ছে
return
অবশ্যই, একটি শেল বিল্টিন is