Message Queues
จะมีลักษณะคล้ายกับไฟล์ไปป์ ทำให้สามารถส่งบล็อกข้อมูลจากโปรเซสหนึ่งไปยังโปรเซสหนึ่ง ผ่านเคอร์เนล เช่นเดียวกัน แต่ละบล็อกข้อมูลจะมีหมายเลขของบล็อกนั้น แต่สิ่งที่แตกต่างกับไฟล์ไปป์ คือ ไม่ต้องกำหนดการทำงานร่วมกันของแต่ละโปรเซสที่ใช้งาน ซึ่งก็เป็นข้อดีคือ โปรเซสสารถจะเขียนข้อมูลไปยัง queue แล้วจบการรันโปรเซส โดยที่โปรเซสอื่นสารถจะอ่านข้อความได้ภายหลัง แต่ก็มีข้อเสียเช่นกัน คือ ขนาดของบล็อกถูกกำจัดรวมทั้งจำนวนบล็อกทั้งหมดที่มีบนระบบก็ถูก จำกัดไว้เช่นกัน (ด้วยความจุรวมกันของบล็อกข้อมูล)
อย่างไรก็ตาม มาตรฐาน X/Open ก็ไม่ได้ระบุข้อจำกัดเหล่านี้ไว้อย่างชัดเจน เมื่อมีการใช้ขนาดของออบเจ็คข้างต้นมีความจุมากเกินไปอาจจะทำให้บางฟังก์ชั่นทำงานไม่ได้ สำหรับ ลีนุกซ์จะมีตัวแปร 2 อย่าง คือ MSGMAX(4096) และ MSGMNB(16384) ซึ่งหมายถึงความจุของแต่ละบล็อกข้อความ และ ความจุทั้งหมดของ queue ค่าเหล่านี้อาจะแตกต่างกันไปหรือ ในบางระบบอาจจะไม่ใช้ค่านี้เลยก็ได้
ฟังก์ชั่นที่ใช้งานใน Message Queues
Msgget
จะสร้าง message queue มีรูปแบบการใช้งานดังนี้
Int megget(key_t key, int msgflg);
key เป็นตัวแปร int เพื่อจำแนกออบเจ็ค IPC เช่นเดียวกับ IPC fadlities อื่นๆ เพื่อสร้าง message queue เฉพาะขึ้นมา นอกจากนี้ยังมีค่าเฉพาะ คือ IPC_PRIVATE ที่จะสร้าง เพื่อจะใช้งานในโปรเซสปัจจุบันเท่านั้น
msgflg จะเป็นบิตเพอร์มิสชั่น 9 บิตด้วยกัน นอกจากนี้ยังสามารถใช้งาน IPC_CREAT เพื่อสร้าง queue ใหม่ โดยจะต้อง or กับบิตเพอร์มิตชั่น 9 บิตข้างต้น อย่างไรก็ตามถ้ามี queue อยู่แล้วก็จะไม่ใช้ IPC_CREAT ฟังก์ชั่นจะส่งค่ากลับเป็น message identifier จำนวนเต็มบวก หรือ -1 ถ้าทำงานไม่สำเร็จ
Msgsnd
จะเพิ่มข้อมูลเข้าไปในโครงสร้างข้อมูล message queue มีรูปแบบการใช้งานดังนี้
Int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
โครงสร้างข้อมูลในบล็อก จะประกอบด้วยสองส่วน คือ ข้อความจะต้องเล็กกว่าความจุบล็อกและจะต้องมีตัวแปร long int เพื่ออ้างอิงถึงข้อความ ดังนั้นโครงสร้างข้อมูลของข้อความ ควรจะมีลักษณะดังนี้
struct my_q_st {
long int mesg_ident;
/* The data you wish to transfer */
}
mesg_ident จะถูกใช้งานในฟังก์ชั่นรับข้อมูล ไม่สามารถจะละทิ้งไปได้ นอกจากนี้ยังจำเป็นที่จะต้อง กำหนดค่าเริ่มต้นให้กับตัวแปรนี้อีกด้วย เพื่อให้สามารถอ้างถึง queue ได้ทันที
msqid เป็น message identifier ที่ส่งกลับฟังก์ชั่น msgget
msg_ptr เป็นพอยเตอร์ชี้ไปยังข้อความทีจะส่งไป (ซึ่งจะต้องเริ่มต้นด้วยตัวแปร lomg int ข้างต้น) พารามิเตอร์ msg_sz เป็นขนาดของข้อความที่ชี้ไปโดยพอยเตอร์ msg_ptr
msgflg เป็นแฟลกกำหนดการทำงานถ้า message queue เต็ม หรือ มีจำนวน queues เกินกว่าที่กำหนด โดยถ้าแฟลกประกอบด้วย IPC_NOWAIT จะไม่มีการส่งข้อความเข้าไปยัง queue และส่งค่า กลับเป็น -1 ทันที แต่ถ้าแฟลกนี้เคลียร์ จะรอจนกว่า queue จะว่าง
Msgrcv
จะแอ็คเซสข้อมูลใน message queue มีรูปแบบการใช้งานดังนี้
int msgrcv (int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
msqid เป็น message queue identifier ค่าส่งกลับจากฟังก์ชั่น msgget
msg_ptr เป็นพอยเตอร์ชี้ไปยยังโครงสร้างข้อมูลที่จะเก็บข้อมูลจาก queue (จะต้องประกอบด้วย ตัวแปร long int ดังที่ได้อธิบายไปแล้วข้างต้น)
msg_sz เป็นขนาดข้อมูลที่ชี้โดยพอยเตอร์ msg_ptr
msgtype จะกำหนดข้อความที่ต้องการ โดยถ้าเป็น 0 จะแอ็คเซสข้อความตามลำดับที่ส่งเข้าไปใน queue ถ้าต้องการจะแอ็คเซสข้อความที่ต้องการ ให้กำหนดเป็นชนิด (หมายเลข) ของข้อความนั้น แต่ ถ้าน้อยกว่า 0 (-n) จะแอ็คเซสข้อความที่ตรงกัน หรือ น้อยกว่าค่า msgtype
msgflg จะควบคุมการทำงานเมื่อไม่มีข้อความอยู่ใน queue โดยถ้าแฟลกนี้เคลียร์ จะทำให้ฟังก์ชั่นรอ จนกระทั่งมีข้อความมาใน queue
Msgctl
ฟังก์ชั่นสุดท้าย คือ msgctl ทำหน้าที่คล้ายกับฟังก์ชั่นที่ควบคุม shared memory มีรูปแบบการใช้งานดังนี้ int msgctl (int msqid, int command, struct msqid_ds *buf);
Msqid เป็น message identifier ค่าส่งกลับจากฟังก์ชั่น msgget
command เป็นคำสั่งที่จะให้ฟังก์ชั่นทำงาน ดังต่อไปนี้
คำสั่งการตรวจสอบสถานะของ Message Queue
โดยใช้คำสั่ง ipcs –q และ ipcrm msg
(หรือ ipcrm -q ) ดังตัวอย่างการใช้งานต่อไปนี้
ipcs –q คือการ list ข้อมูล
ipcrm –q คือการลบข้อมูล
$ ipcs -q
________________Message Queues___________________
msqid owner perms used-bytes messages
384 benn 666 2048 2
หมายถึงมีข้อความ 2 ข้อความอยู่ใน queue มีความจุรวม 2048 ไบต์
ส่วนคำสั่ง ipcrm msg จะลบ queue ออกจากระบบ