หมายเลขที่ส่งไปยังการเรียก_exit()/ exit_group()ระบบ (บางครั้งเรียกว่ารหัสออกเพื่อหลีกเลี่ยงความคลุมเครือที่มีสถานะออกซึ่งยังหมายถึงการเข้ารหัสของรหัสทางออกหรือหมายเลขสัญญาณและข้อมูลเพิ่มเติมขึ้นอยู่กับว่ากระบวนการนั้นถูกฆ่าหรือออกตามปกติ ) เป็นชนิดintดังนั้นบนระบบที่เหมือน Unix เช่น Linux โดยทั่วไปจะเป็นจำนวนเต็ม 32 บิตที่มีค่าตั้งแต่ -2147483648 (-2 31 ) ถึง 2147483647 (2 31 -1)
อย่างไรก็ตามในระบบทั้งหมดเมื่อการปกครอง (หรือ subreaper เด็กหรือinitถ้าพ่อแม่เสียชีวิต) ใช้wait(), waitpid(), wait3(), wait4()สายระบบจะดึงมันเพียงต่ำกว่า 8 บิตของมันที่มีอยู่ (ค่า 0-255 (2 8 - 1))
เมื่อใช้waitid()API (หรือตัวจัดการสัญญาณบน SIGCHLD) ในระบบส่วนใหญ่ (และPOSIX ในขณะนี้ต้องมีความชัดเจนมากขึ้นในรุ่นมาตรฐานปี 2559 (ดูส_exit()เปค )) จำนวนเต็มจะพร้อมใช้งาน (ในsi_statusฟิลด์ของโครงสร้างที่ส่งคืน ) นั่นไม่ใช่กรณีบน Linux แต่ถึงแม้ว่าจะตัดทอนหมายเลขไปเป็น 8 บิตด้วยwaitid()API แต่ก็มีแนวโน้มที่จะเปลี่ยนแปลงในอนาคต
โดยทั่วไปคุณต้องการใช้ค่า 0 (โดยทั่วไปหมายถึงความสำเร็จ) ถึง 125 เท่านั้นเนื่องจากเชลล์จำนวนมากใช้ค่าที่สูงกว่า 128 ในการ$?แสดงสถานะทางออกเพื่อเข้ารหัสหมายเลขสัญญาณของกระบวนการที่ถูกฆ่าและ 126 และ 127 สำหรับพิเศษ เงื่อนไข
คุณอาจต้องการใช้ 126 ถึง 255 exit()เพื่อหมายถึงสิ่งเดียวกันกับที่ทำกับเชลล์$?(เช่นเมื่อสคริปต์ทำret=$?; ...; exit "$ret") การใช้ค่าภายนอก 0 -> 255 โดยทั่วไปแล้วไม่มีประโยชน์ โดยทั่วไปคุณจะทำเช่นนั้นก็ต่อเมื่อคุณรู้ว่าผู้ปกครองจะใช้waitid()API บนระบบที่ไม่ตัดทอนและคุณจำเป็นต้องมีช่วงค่า 32 บิต โปรดทราบว่าถ้าคุณทำexit(2048)เช่นนั้นจะถูกมองว่าเป็นความสำเร็จโดยผู้ปกครองโดยใช้wait*()API แบบดั้งเดิม
ข้อมูลเพิ่มเติมได้ที่:
หวังว่าคำถาม & คำตอบควรตอบคำถามอื่น ๆ ของคุณเป็นส่วนใหญ่และชี้แจงว่าสถานะการออกนั้นมีความหมายอย่างไร ฉันจะเพิ่มอีกสองสามสิ่ง:
กระบวนการไม่สามารถยุติได้เว้นแต่ว่าจะมีการฆ่าหรือเรียกการเรียก_exit()/ exit_group()ระบบ เมื่อคุณกลับมาจากmain()ในCระบบ libc จะเรียกการเรียกของระบบนั้นด้วยค่าที่ส่งคืน
ภาษาส่วนใหญ่มีexit()ฟังก์ชั่นที่ล้อมรอบการเรียกของระบบและค่าที่ใช้ถ้าโดยทั่วไปจะถูกส่งผ่านไปยังการเรียกของระบบ (โปรดทราบว่าสิ่งเหล่านั้นมักจะทำสิ่งต่างๆมากกว่าเช่นการล้างข้อมูลด้วยexit()ฟังก์ชั่นของ C ซึ่งจะลบบัฟเฟอร์ stdio, รันatexit()hooks ...
นั่นคือกรณีอย่างน้อย:
$ 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)))"'
และอื่น ๆ ตัดทอนจำนวนเช่น/bashmksh
¹มีแนวโน้มว่าจะเปลี่ยนแปลงในรุ่นถัดไป ขณะนี้การพัฒนาksh93ได้ถูกยึดเป็นความพยายามของชุมชนนอก AT&T พฤติกรรมดังกล่าวแม้ว่า POSIX จะได้รับการสนับสนุน แต่อย่างใด
returnแน่นอนว่า shell builtin