_exit()
/ exit_group()
सिस्टम कॉल के लिए दी गई संख्या (कभी-कभी बाहर निकलने की स्थिति के साथ अस्पष्टता से बचने के लिए निकास कोड के रूप में संदर्भित किया जाता है जो निकास कोड या संकेत संख्या और अतिरिक्त जानकारी के एन्कोडिंग की भी बात करता है जो इस प्रक्रिया पर निर्भर करता है कि क्या सामान्य रूप से मारा गया था या बाहर निकल गया था। ) प्रकार है int
, इसलिए लिनक्स जैसे यूनिक्स जैसी प्रणालियों पर, आमतौर पर एक 32bit पूर्णांक -2147483648 (-2 31 ) से 2147483647 (2 31 -1) के मूल्यों के साथ होता है ।
हालांकि, सभी सिस्टम पर, जब माता-पिता की प्रक्रिया (या बच्चे subreaper या init
अगर माता-पिता की मृत्यु हो गई) का उपयोग करता है wait()
, waitpid()
, wait3()
, wait4()
सिस्टम कॉल इसे पुनः प्राप्त करने के लिए, केवल इसके बारे में कम 8 बिट उपलब्ध (मान 0 255 (2 करने के लिए कर रहे हैं 8 - 1))।
waitid()
अधिकांश प्रणालियों पर एपीआई (या सिगल्डएलडी पर एक सिग्नल हैंडलर) का उपयोग करते समय , (और पोसिक्स के रूप में अब मानक के 2016 संस्करण में अधिक स्पष्ट रूप से आवश्यक है ( _exit()
विनिर्देश देखें )), पूर्ण संख्या उपलब्ध है ( si_status
लौटे संरचना के क्षेत्र में) )। यह लिनक्स पर अभी तक ऐसा नहीं है, जो कि waitid()
एपीआई के साथ संख्या को 8 बिट तक कम कर देता है, हालांकि भविष्य में इसके बदलने की संभावना है।
आम तौर पर, आप केवल मान 0 (आमतौर पर सफलता का अर्थ) का उपयोग केवल 125 तक करना चाहते हैं, क्योंकि कई गोले निकास स्थिति के अपने $?
प्रतिनिधित्व में 128 से ऊपर के मूल्यों का उपयोग करते हैं, जो कि मारे जाने की प्रक्रिया की संकेत संख्या को सांकेतिक शब्दों में बदलना है और विशेष के लिए 126 और 127 है। शर्तेँ।
आप 126 का उपयोग करने के लिए 255 का उपयोग करना चाह सकते हैं exit()
, जैसा कि वे शेल के लिए करते हैं $?
(जैसे जब कोई स्क्रिप्ट करता है ret=$?; ...; exit "$ret"
)। 0 -> 255 के बाहर मूल्यों का उपयोग करना आमतौर पर उपयोगी नहीं होता है। आप आमतौर पर केवल यही करते हैं कि यदि आप जानते हैं कि माता-पिता waitid()
एपीआई सिस्टम का उपयोग करेंगे जो कम नहीं करते हैं और आपको 32 बिट श्रेणी के मानों की आवश्यकता होती है। ध्यान दें कि यदि आप एक exit(2048)
उदाहरण के लिए करते हैं, तो पारंपरिक 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) = ?
POSIX अपरिभाषित व्यवहार को छोड़ देता है यदि 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 + max_signal_number से बाहर निकलने के मूल्यों के लिए सबसे अजीब व्यवहार है जहां कॉल करने के बजाय exit_group()
, यह खुद को संबंधित सिग्नल¹ से मारता है।
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
और अन्यथा bash
/ जैसी संख्या को काट देता है mksh
।
Change हालांकि अगले संस्करण में बदलने की संभावना है। अब जब ksh93
एटी एंड टी के बाहर सामुदायिक प्रयास के रूप में विकास को ले लिया गया है, तो उस व्यवहार को, भले ही पोसिक्स द्वारा किसी तरह प्रोत्साहित किया गया हो, वापस लाया जा रहा है।
return
निश्चित रूप से है, एक खोल builtin।