[แม้ว่าฉันจะทำงานใน perl ฉันเชื่อว่าคำถามนี้เกี่ยวข้องกับ Linux System V IPC
API และขีดจำกัดค่อนข้างจะเป็นเฉพาะเจาะจง Perl]
ฉันมีเครื่อง Centos สองเครื่อง แต่ละเครื่องใช้ CentOS Linux รีลีส 7.9.2009 (คอร์)
ฉันมีโปรแกรมที่แยกเด็กออก จากนั้นใช้ข้อความ IPC ของ System V เพื่อสื่อสารกับเด็ก เด็กเตรียมคำตอบและส่งไปยังผู้ปกครอง
ในเครื่องหนึ่งเราเห็นพฤติกรรมที่คาดหวัง เด็กสร้างชุดข้อความผู้ปกครองใช้พวกเขา ในบางครั้ง เด็กจะทำงานเร็วกว่าพาเรนต์เล็กน้อย ดังนั้นอาจเต็มคิว เด็กจึงรอจนกว่าพาเรนต์จะใช้ข้อความบางอย่างและดำเนินการต่อ
เราสามารถตรวจสอบขนาดคิวด้วย ipcs -q และดูว่าถึงขีดจำกัดเริ่มต้นที่ 10 ข้อความต่อคิวในบางครั้ง ลูกจะหยุดชั่วคราว จากนั้นเราจะเห็นคิวว่างเปล่าตามที่คาดไว้
เราเชื่อว่ามีการระบุขีดจำกัดของคิวในไฟล์ใน /proc/sys/fs/mqueue/ และตัวอย่างเช่น msg_max คาดว่าจะเป็น 10ค่าเหล่านี้เหมือนกันในทั้งสองเครื่อง
เรายังสามารถดู ulimits ของผู้ใช้ที่เกี่ยวข้องกับคิวได้ ขีด จำกัด -q และเห็นค่าเกิน 800,000 ไบต์ทั้งสองเครื่อง
ปริศนาคือในเครื่องที่สองของเรา เราเห็นเด็กเขียนข้อความสามข้อความไปยังคิว และพยายามเขียนข้อความสี่และรอ - เราจงใจไม่กำหนดเวลา
เหมือนกับว่าผู้เขียนเชื่อว่าคิวเต็มแล้ว ทั้งๆ ที่ ipcs -q แสดงรายการในคิวเพียง 3 รายการเท่านั้น ณ จุดนี้ผู้ปกครองยังไม่พยายามอ่านข้อความ
------ คิวข้อความ --------
เจ้าของคีย์ msqid อนุญาตข้อความที่ใช้ไบต์
0x0000002a 1474560 เดฟ 600 15020 3
คำถาม: นอกจากคิวเต็มแล้ว อะไรจะทำให้ msgsnd() หยุดชั่วคราว?
การหยุดชั่วคราวดูเหมือนจะดำเนินต่อไปอย่างไม่มีกำหนด เด็กจะดำเนินการต่อเมื่อผู้ปกครอง
เริ่มใช้งานและอ่านบางข้อความ
เรามีเครื่องจำนวนมากที่ใช้รหัสนี้โดยไม่มีปัญหา มันล้มเหลวในเครื่องใหม่สามเครื่อง
น่าจะมีฟีเจอร์เฉพาะสภาพแวดล้อมที่โต้ตอบกับรหัสของเราหรือไม่
รหัส Perl ใช้ไลบรารีแบบบางเหนือการเรียกของระบบ (รายละเอียดถูกตัดออก)
$mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
msgsnd( $mQueue, pack("l! a*", length($msg), $msg);