หมายเลขที่ส่งไปยังการเรียก_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)))"'
และอื่น ๆ ตัดทอนจำนวนเช่น/bash
mksh
¹มีแนวโน้มว่าจะเปลี่ยนแปลงในรุ่นถัดไป ขณะนี้การพัฒนาksh93
ได้ถูกยึดเป็นความพยายามของชุมชนนอก AT&T พฤติกรรมดังกล่าวแม้ว่า POSIX จะได้รับการสนับสนุน แต่อย่างใด
return
แน่นอนว่า shell builtin