เว็บบล๊อกผลงาน (Web Blog) นักศึกษาระดับปริญญาโท คณะวิทยาศาสตร์และเทคโนโลยี สาขาวิทยาการคอมพิวเตอร์ มหาวิทยาลัยธรรมศาสตร์

วันศุกร์ที่ 19 มีนาคม พ.ศ. 2553

Message Queues

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 ออกจากระบบ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

คลังบทความของบล็อก

favourites