“ exit (-1)” มาจากไหน?


22

ฉันเห็นในจำนวนมากซอฟต์แวร์เดิมและบทเรียนที่ไม่ดีบนอินเทอร์เน็ตที่แนะนำให้ใช้exit(-1), return -1หรือคล้ายกันที่จะเป็นตัวแทน "เลิกผิดปกติ" ปัญหาคือใน POSIX อย่างน้อย-1ไม่เคยมีมาก่อนและไม่ใช่รหัสสถานะที่ถูกต้อง man 3 exitแสดงให้เห็นว่าexit()ผลตอบแทนที่คุ้มค่าของการstatus & 0377ไปยังผู้ปกครองที่มีความหมายว่าจะกลายเป็น-1 255สำหรับระบบที่ไม่ใช่ POSIX EXIT_FAILUREขอแนะนำให้พกพาได้ แต่ฉันไม่เคยเห็น "-1 หมายถึงการสิ้นสุดที่ผิดปกติ" ร่วมกับ "EXIT_FAILURE อาจเป็นสิ่งที่นอกเหนือจาก 1" ซึ่งบ่งชี้ว่าพวกเขาเชื่ออย่างชัดเจนว่า "-1" นั้นเป็นเรื่องปกติแม้ในระบบที่ไม่ใช่ POSIX

ต่อไปนี้เป็นตัวอย่างของคำถาม StackOverflowที่ทำให้เกิดปัญหานี้ ซอฟต์แวร์ "unrealircd" เป็นตัวอย่างของโปรแกรมที่ใช้exit(-1)ในการยกเลิกโปรแกรม systemdในทางปฏิบัตินี้ทำให้ยากที่จะติดต่อกับ

รูปแบบการต่อต้านนี้มาจากไหน มันถูกต้องในบางบริบท?


1
"เหมือนระบบ Unix มีการประชุมที่แข็งแกร่งที่มีสถานภาพเป็นทางออกของ 0 หมายถึงความสำเร็จและที่ไม่ออกศูนย์หมายถึงสถานะความล้มเหลว ... การประชุมนี้สวยมากสายยากเข้าไปในเปลือกหอย Unix ..." ( ไม่ใช่ศูนย์สถานะออก สำหรับทางออกที่สะอาด )
gnat

@gnat ตามคู่มือ libcสถานะการออกจะรวมอย่างชัดเจน 0 ถึง 255 หากมีคำตอบอยู่ที่ไหนสักแห่งที่ระบุว่าค่าลบอยู่ในจุดที่ถูกต้องฉันจะยอมรับมัน แต่ฉันพบว่าน่าสงสัยอย่างมาก
222973

1
@gnat "255" เข้ากับ an unsigned charได้ง่าย
222973


1
@gnat ไบต์ใน "Java" ไม่ใช่อักขระที่ไม่ได้ลงนามมันจะเทียบเท่ากับช่วงcharตั้งแต่ค่าคือ -128 ถึง 127 นอกจากนี้ฉันได้ระบุ "-1" ได้รับการแปลงเป็น "255" ในเนื้อหาคำถามของฉัน .
222973

คำตอบ:


20

คอมพิวเตอร์ Unix เกือบทั้งหมดใช้ twos-complement สำหรับจำนวนเต็มและใน twos-complement -1 จะเป็น "all bits 1" เสมอโดยไม่คำนึงถึงขนาดของคำ หากคุณต้องการรหัสทางออกที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้โดยไม่คำนึงถึงขนาดของสถานะการออกของโปรแกรมโดยใช้ -1 และปล่อยให้ไลบรารีตัดออกได้อย่างสะดวก

สิ่งนี้มีประโยชน์เพราะเมื่อสคริปต์หรือโปรแกรมมีสถานะทางออกที่เป็นไปได้มากกว่าหนึ่งสถานะ (ดูgrepตัวอย่างง่ายๆ) โดยปกติแล้วสถานะที่มีความหมายจะถูกกำหนดให้กับตัวเลขที่น้อยที่สุดทำให้รหัสทางออกที่ใหญ่ที่สุดที่เป็นไปได้คือ ยกเลิก "เนื่องจากไม่น่าจะขัดแย้งกับค่าสถานะที่มีความหมาย


ใช้ glibc เป็นตัวอย่างซึ่งการดำเนินการเป็นexit() status &= 0xffมี "ขนาดคำ" ที่-1 & 0xffไม่ 255 หรือไม่ ไม่แน่นอนเพราะจุดประสงค์ทั้งหมดนั้นเพื่อให้เหมาะสมในช่วง 0-255 ประโยคสุดท้ายของคุณไม่สมเหตุสมผล: รหัสสถานะ 128-255 มีจุดประสงค์พิเศษในระบบ UNIX
222973

2
อย่าสับสนค่า Bash exit (ซึ่งเป็น 0-127, 128+ เป็นค่า Bash พิเศษ) ด้วยค่าการออกจากโปรแกรม (ซึ่งคือ 0-255 ดูที่pubs.opengroup.org/onlinepubs/009695399/functions/exit.html ) สำหรับขนาดโปรดจำไว้ว่าโปรแกรมเมอร์ C นั้นมีหลายขนาดตั้งแต่เริ่มต้น (12, 16 และ 32 บิต) ตั้งแต่เริ่มต้นดังนั้นเราจึงลองใช้สำนวนที่ไม่ต้องการให้เราพิจารณาขนาดของคำโดยอัตโนมัติ เนื่องจาก Unix ถือกำเนิด Posix ภายใน 2 ทศวรรษที่ผ่านมาไม่มีข้อ จำกัด 8 บิตเสมอไปดังนั้นเราจึงเขียนมันจึงไม่สำคัญ
ทอดด์ Knarr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.