ฉันจะโพสต์สิ่งนี้เป็นคำตอบเพื่อให้มีวิธีแก้ปัญหาบางอย่างหากนี่เป็นปัญหา
สถานะการออกเป็น 0 หมายถึงการออกปกติจากโปรแกรมที่ประสบความสำเร็จ โปรแกรมออกสามารถเลือกจำนวนเต็มใด ๆ ระหว่าง 0 และ 255 ออกจากสถานะของมัน โดยทั่วไปโปรแกรมใช้ค่าน้อย เชลล์ใช้ค่า 126 ขึ้นไปเพื่อรายงานเงื่อนไขพิเศษดังนั้นจึงเป็นการดีที่สุดที่จะหลีกเลี่ยง
ที่ระดับ C API โปรแกรมจะรายงานสถานะ 16 บิตที่เข้ารหัสทั้งสถานะการออกของโปรแกรมและสัญญาณที่ฆ่าหากมี
ในเชลล์สถานะการออกของคำสั่ง (บันทึกใน$?
) ทำให้สถานะการออกจริงของโปรแกรมและค่าสัญญาณ: หากโปรแกรมถูกฆ่าโดยสัญญาณ$?
ถูกตั้งค่าเป็นค่าที่มากกว่า 128 (กับเชลล์ส่วนใหญ่ค่านี้คือ 128 บวกกับหมายเลขสัญญาณ ATT ksh ใช้หมายเลขสัญญาณ 256 + และ yash ใช้หมายเลขสัญญาณ 384 + ซึ่งหลีกเลี่ยงความคลุมเครือ แต่เชลล์อื่นไม่ได้ทำตามความเหมาะสม)
โดยเฉพาะอย่างยิ่งถ้า$?
เป็น 0 โปรแกรมของคุณจะออกตามปกติ
โปรดทราบว่านี่รวมถึงกรณีของกระบวนการที่ได้รับ SIGTERM แต่มีตัวจัดการสัญญาณสำหรับมันและในที่สุดก็จะออกตามปกติ (อาจเป็นผลทางอ้อมของสัญญาณ SIGTERM ซึ่งอาจไม่ใช่)
ในการตอบคำถามในชื่อของคุณระบบจะไม่ส่ง SIGTERM อัตโนมัติ มีสัญญาณบางอย่างที่ส่งโดยอัตโนมัติเช่น SIGHUP เมื่อเทอร์มินัลหายไป SIGSEGV / SIGBUS / SIGILL เมื่อกระบวนการทำสิ่งที่ไม่ควรทำ SIGPIPE เมื่อเขียนไปยังท่อ / ซ็อกเก็ตที่ชำรุดเป็นต้นและมี สัญญาณเล็กน้อยที่ถูกส่งเนื่องจากการกดปุ่มในเทอร์มินัลส่วนใหญ่ SIGINT สำหรับCtrl+ C, SIGQUIT สำหรับCtrl+ \และ SIGTSTP สำหรับCtrl+ Zแต่ SIGTERM ไม่ใช่หนึ่งในนั้น หากกระบวนการได้รับ SIGTERM กระบวนการอื่นจะส่งสัญญาณนั้น
¹ พูดประมาณ