อะไรคือความแตกต่างระหว่าง exit (0) และ exit (1) ใน C?


99

ใครช่วยบอกที อะไรคือความแตกต่างระหว่างexit(0)และexit(1)ในภาษา C?

คำตอบ:


118

อะไรคือความแตกต่างระหว่างexit(0)และexit(1)ในภาษา C?

exit(0)บ่งชี้ว่าการยุติโปรแกรมสำเร็จและเป็นแบบพกพาได้อย่างสมบูรณ์ในขณะที่
exit(1)(โดยปกติ) แสดงถึงการสิ้นสุดที่ไม่สำเร็จ อย่างไรก็ตามการใช้งานไม่สามารถพกพาได้

โปรดทราบว่ามาตรฐาน C กำหนดEXIT_SUCCESSและEXIT_FAILUREส่งคืนสถานะการสิ้นสุดจากโปรแกรม C

0และEXIT_SUCCESSเป็นค่าที่มาตรฐานระบุเพื่อบ่งชี้การยุติที่ประสบความสำเร็จอย่างไรก็ตามEXIT_FAILUREเป็นเพียงค่ามาตรฐานสำหรับการส่งคืนการยุติที่ไม่สำเร็จ 1จะใช้สำหรับการใช้งานแบบเดียวกันในหลาย ๆ การใช้งาน


อ้างอิง:

มาตรฐาน C99: 7.20.4.3 exitฟังก์ชัน
Para 5

สุดท้ายการควบคุมจะถูกส่งกลับไปยังสภาพแวดล้อมโฮสต์ หากค่าสถานะเป็นศูนย์หรือ EXIT_SUCCESSระบบจะส่งคืนรูปแบบการนำไปใช้งานของสถานะการยุติที่สำเร็จ หากค่าสถานะเป็นEXIT_FAILUREรูปแบบการนำไปใช้งานของสถานะที่ไม่สำเร็จจะถูกส่งกลับ มิฉะนั้นสถานะที่ส่งคืนคือการใช้งาน-de fi ned


1
คุณช่วยอธิบายการไม่พกพาได้หรือไม่? โดยเฉพาะอย่างยิ่งรหัสทางออกที่ไม่ใช่ศูนย์แสดงถึงโหมดความล้มเหลวที่แตกต่างกัน เป็นเรื่องปกติที่แอปพลิเคชันจะใช้สิ่งนี้เพื่อให้ข้อมูลเพิ่มเติม ค่าคงที่ ( EXIT_FAILURE) เดียวจึงไม่เพียงพอ
Konrad Rudolph

@KonradRudolph: ฉันเพิ่มการอ้างอิงที่เกี่ยวข้อง หวังว่าจะช่วยได้
บันทึก Alok

1
@Als: POSIX เป็นมาตรฐาน มาตรฐาน C อาจจะบอกว่า "การดำเนินการตามที่กำหนดไว้" แต่ที่ไม่เทียบเท่ากับพูดว่า "ไม่ได้แบบพกพา" เมื่อใช้งานในความเป็นจริงไม่เห็นด้วยกับการประชุม
Cat Plus Plus

1
@PeterM: หาแพลตฟอร์มที่ไม่ใช้อนุสัญญานี้ให้ฉัน ก็มีแนวโน้มที่จะเป็นบางส่วนผู้เชี่ยวชาญ / ฝัง / อิสระ / สิ่งสภาพแวดล้อมที่พกพาexitเป็นอย่างน้อยจากความกังวลของคุณ (นรกมีอาจไม่ได้เป็นห้องสมุด C ที่มีอยู่มี. ไม่มีอะไรเป็นแบบพกพา !!! 111)
Cat Plus Plus

3
@CatPlusPlus: บน OpenVMS การโทรexitด้วยค่าแปลก ๆ แสดงถึงความสำเร็จ exit(0)ถือเป็นกรณีพิเศษเพื่อประโยชน์ในการปฏิบัติตาม C ใช่ POSIX เป็นมาตรฐาน แต่ไม่ใช่ทุกระบบที่เป็นไปตามนั้น หากคุณต้องการเขียนโค้ดที่ถือว่า POSIX คุณสามารถทำได้โดยอิสระ แต่จะ จำกัด การพกพาของโค้ดของคุณ
Keith Thompson

12

exit ในภาษา C ใช้จำนวนเต็มแทนสถานะการออก

ออกจากความสำเร็จ

โดยปกติสถานะการออกเป็น 0 จะถือว่าเป็นความสำเร็จหรือการออกโดยเจตนาที่เกิดจากการดำเนินการสำเร็จของโปรแกรม

ออกจากความล้มเหลว

สถานะการออกเป็น 1 ถือเป็นความล้มเหลวและโดยทั่วไปหมายความว่าโปรแกรมต้องออกด้วยเหตุผลบางประการและไม่สามารถดำเนินการทุกอย่างให้เสร็จสมบูรณ์ในโฟลว์โปรแกรมปกติได้

นี่คือแหล่งข้อมูล GNU ที่พูดถึงสถานะการออก


ตามที่ @Als ระบุไว้ควรใช้ค่าคงที่สองค่าแทน 0 และ 1

EXIT_SUCCESS ถูกกำหนดโดยมาตรฐานให้เป็นศูนย์

EXIT_FAILURE ไม่ได้ถูก จำกัด โดยมาตรฐานให้เป็นหนึ่งเดียว แต่หลาย ๆ ระบบนำมาใช้เป็นระบบเดียว


9

exit(0)แสดงว่าโปรแกรมสิ้นสุดโดยไม่มีข้อผิดพลาด exit(1)แสดงว่ามีข้อผิดพลาด

คุณสามารถใช้ค่าอื่นนอกเหนือจาก1เพื่อแยกความแตกต่างระหว่างข้อผิดพลาดประเภทต่างๆ


4

ความแตกต่างคือค่าที่ส่งคืนสู่สภาพแวดล้อมอยู่0ในกรณีก่อนหน้าและ1ในกรณีหลัง:

$ ./prog_with_exit_0
$ echo $?
0
$

และ

$ ./prog_with_exit_1
$ echo $?
1
$

นอกจากนี้โปรดทราบว่าค่ามาโคร EXIT_SUCCESSและEXIT_FAILUREใช้เป็นอาร์กิวเมนต์ของexitฟังก์ชันได้รับการกำหนดการนำไปใช้งาน แต่โดยปกติจะตั้งค่าเป็นตามลำดับ0และเป็นตัวเลขที่ไม่ใช่ศูนย์ (POSIX ต้องEXIT_SUCCESSเป็น 0) โดยปกติexit(0)หมายถึงความสำเร็จและexit(1)ความล้มเหลว

การexitเรียกใช้ฟังก์ชันที่มีอาร์กิวเมนต์ในmainฟังก์ชันเทียบเท่ากับคำสั่งที่returnมีอาร์กิวเมนต์เดียวกัน


2

exit คือการเรียกระบบที่ใช้เพื่อสิ้นสุดกระบวนการทำงานที่เรียกว่า พารามิเตอร์ที่จะออกใช้เพื่อแจ้งกระบวนการพาเรนต์เกี่ยวกับสถานะของกระบวนการย่อย ดังนั้นสามารถใช้ exit (0) (และมักใช้) เพื่อระบุการดำเนินการที่ประสบความสำเร็จและ exit (1) เพื่อตั้งค่าสถานะข้อผิดพลาด ลิงค์อ้างอิง


1

เมื่อปฏิบัติการสิ้นสุด (ออก) จะส่งคืนค่าให้กับเชลล์ที่รัน exit(0)มักจะบ่งชี้ว่าทุกexit(1)อย่างเรียบร้อยดีในขณะที่ระบุว่ามีบางอย่างผิดปกติ



1

exit(0) หมายถึงโปรแกรม (กระบวนการ) ยุติตามปกติเรียบร้อย ..

exit(1) หมายถึงโปรแกรม (กระบวนการ) ยุติโดยปกติไม่สำเร็จ ..

หากคุณต้องการสังเกตสิ่งนี้คุณต้องรู้จักการจัดการสัญญาณและการจัดการกระบวนการใน Unix ...

รู้เกี่ยวกับsigaction, watipid()..for () ... เช่น .... API ...........


1

exit(0)ประพฤติชอบreturn 0ในmain()หน้าที่exit(1)ประพฤติชอบreturn 1. มาตรฐานคือmainฟังก์ชั่นreturn 0นั้นหากโปรแกรมจบลงสำเร็จในขณะที่ค่าที่ไม่ใช่ศูนย์หมายความว่าโปรแกรมนั้นถูกยกเลิกด้วยข้อผิดพลาดบางอย่าง


1

ทางออก (0) เทียบเท่ากับทางออก (EXIT_SUCCESS)

ทางออก (1) เทียบเท่ากับทางออก (EXIT_FAILURE)

ในความล้มเหลวโดยปกติค่าบวกใด ๆ จะถูกส่งกลับเพื่อออกจากกระบวนการซึ่งคุณสามารถค้นหาบนเชลล์ได้โดยใช้ $?

ค่ามากกว่า 128 ที่เกิดจากการยุติโดยสัญญาณ ดังนั้นหากคำสั่งเชลล์ใด ๆ ยุติโดยสัญญาณสถานะการส่งคืนจะต้องเป็น (หมายเลขสัญญาณ 128 +)

ตัวอย่างเช่น:

หากคำสั่งเชลล์ใด ๆ ถูกยุติโดย SIGINT แล้ว $? จะให้ 130 (128 + 2) (ที่นี่ 2 คือหมายเลขสัญญาณสำหรับ SIGINT ตรวจสอบโดยใช้ kill -l)


0

exit function. ในภาษาการเขียนโปรแกรม C ฟังก์ชัน exit เรียกใช้ฟังก์ชันทั้งหมดที่ลงทะเบียนด้วย at exit และยุติโปรแกรม

exit(1)หมายถึงโปรแกรม (กระบวนการ) ยุติลงไม่สำเร็จ บัฟเฟอร์ไฟล์จะถูกล้างสตรีมถูกปิดและไฟล์ชั่วคราวจะถูกลบ

exit(0) หมายถึงโปรแกรม (กระบวนการ) สิ้นสุดลงเรียบร้อยแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.