คุณไม่สามารถวางใจได้ว่าทุกสัญญาณที่ส่งจะถูกส่ง ตัวอย่างเช่นเคอร์เนล linux "รวมตัวกัน" SIGCHLDหากกระบวนการใช้เวลานานในการจัดการ SIGCHLD จากกระบวนการลูกที่ออก
ในการตอบคำถามอีกส่วนของคุณสัญญาณจะได้รับ "เข้าคิว" ภายในเคอร์เนลหากสัญญาณต่าง ๆ จำนวนหนึ่งเข้ามาสั้นเกินไปในช่วงเวลาหนึ่ง
คุณควรใช้sigaction()
เพื่อตั้งค่าตัวจัดการสัญญาณด้วยsa_sigaction
สมาชิกsiginfo_t
ตั้งค่าsa_mask
สมาชิกของsiginfo_t
อาร์กิวเมนต์อย่างระมัดระวัง ฉันคิดว่านี่หมายถึงปิดบังสัญญาณ "asynch" ทั้งหมดอย่างน้อย จากหน้า man สำหรับ Linux sigaction()
คุณจะปกปิดสัญญาณที่กำลังจัดการอยู่ ฉันคิดว่าคุณควรตั้งค่าsa_flags
สมาชิกเป็น SA_SIGINFO แต่ฉันจำไม่ได้ว่าทำไมฉันถึงมีความเชื่อทางไสยศาสตร์ ฉันเชื่อว่าสิ่งนี้จะทำให้กระบวนการของคุณเป็นตัวจัดการสัญญาณที่ยังคงตั้งค่าโดยไม่มีเงื่อนไขการแข่งขันและสิ่งที่ไม่ได้ถูกขัดจังหวะโดยสัญญาณอื่น ๆ ส่วนใหญ่
เขียนฟังก์ชั่นตัวจัดการสัญญาณของคุณอย่างระมัดระวังมาก โดยทั่วไปเพียงแค่ตั้งค่าตัวแปรส่วนกลางเพื่อระบุว่าสัญญาณถูกจับและมีส่วนที่เหลือของกระบวนการจัดการกับการกระทำที่ต้องการสำหรับสัญญาณนั้น สัญญาณจะถูกหลอกลวงในเวลาที่น้อยที่สุด
นอกจากนี้คุณจะต้องทดสอบรหัสการจัดการสัญญาณของคุณอย่างละเอียดถี่ถ้วน วางไว้ในกระบวนการทดสอบขนาดเล็กและส่งสัญญาณ SIGUSR1 และ SIGUSR2 ให้ได้มากที่สุดอาจจะมาจากโปรแกรมส่งสัญญาณวัตถุประสงค์พิเศษ 2 หรือ 3 จุด ผสมสัญญาณอื่น ๆ เช่นกันหลังจากคุณมั่นใจว่ารหัสของคุณสามารถจัดการ SIGUSR1 และ SIGUSR2 ได้อย่างรวดเร็วและถูกต้อง เตรียมตัวสำหรับการดีบั๊กที่ยากลำบาก
หากคุณใช้ linux และ linux เท่านั้นคุณอาจคิดถึงการใช้signalfd()
เพื่อสร้าง file descriptor ที่คุณสามารถselect()
หรือโพลเพื่อรับสัญญาณเหล่านั้นได้ การใช้signalfd()
อาจทำให้การดีบักง่ายขึ้น
signal(2)
แนะนำอย่างเด่นชัดว่าคุณหลีกเลี่ยงความสับสนนี้โดยใช้sigaction(2)
แทน