ทำไมต้องใช้ message queues เมื่อเรามี shared memory แล้ว? เหตุผลหลายประการ ลองแยกเป็นจุดๆ:
- ข้อความถูกอ่านโดย process หนึ่งแล้วจะหายไป ไม่พร้อมสำหรับ process อื่น แต่ shared memory ข้อมูลพร้อมสำหรับหลาย process
- ต้องการสื่อสารด้วยข้อความขนาดเล็ก
- Shared memory ต้องการ synchronization เมื่อหลาย process เข้าถึงพร้อมกัน
- ถ้าอ่าน/เขียน shared memory บ่อย จะซับซ้อน ไม่คุ้มค่า
- ถ้าไม่ใช่ทุก process ต้องการ shared memory แค่บาง process message queues ดีกว่า
- ส่ง packet ข้อมูลต่างกันไป process ต่างๆ (message type 1, 10, 20) message queues ทำง่ายกว่า
- Message queue เรียงแบบ FIFO (First In First Out)
การใช้ Shared Memory หรือ Message Queues ขึ้นกับความต้องของแอปพลิเคชัน
การสื่อสารด้วย message queues เกิดขึ้นได้ดังนี้:
- Process หนึ่งเขียน shared memory อีก process อ่าน (อ่านได้หลาย process)

- Process หนึ่งเขียน shared memory ด้วย data packets ต่างๆ หลาย process อ่านตาม message type

System call (System V) สำหรับ message queues:
Step 1 - สร้างหรือเชื่อมต่อ message queue (msgget())
Step 2 - เขียน message queue (msgsnd())
Step 3 - อ่าน message queue (msgrcv())
Step 4 - ควบคุม message queue (msgctl())
สร้าง 2 process: หนึ่งเขียน หนึ่งอ่าน
ตัวอย่าง Writer
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65); // สร้าง key แบบ unique
msg_id = msgget(my_key, 0666 | IPC_CREAT); // สร้าง message queue คืน id
message.msg_type = 1;
printf("Write Message: ");
fgets(message.msg, 100, stdin);
msgsnd(msg_id, &message, sizeof(message), 0); // ส่งข้อความ
printf("Sent message is: %s\n", message.msg);
}
ตัวอย่าง Reader
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65);
msg_id = msgget(my_key, 0666 | IPC_CREAT);
msgrcv(msg_id, &message, sizeof(message), 1, 0); // รับข้อความ
printf("Received Message is: %s\n", message.msg);
msgctl(msg_id, IPC_RMID, NULL); // ทำลาย message queue
return 0;
}
ผลลัพธ์
