Tại sao cần message queues khi đã có shared memory? Có nhiều lý do, chia thành các điểm để đơn giản hóa:
- Khi tin nhắn được nhận bởi một tiến trình, nó không còn khả dụng cho tiến trình khác. Trong shared memory, dữ liệu có sẵn cho nhiều tiến trình truy cập.
- Nếu muốn giao tiếp với định dạng tin nhắn nhỏ.
- Dữ liệu shared memory cần bảo vệ bằng đồng bộ hóa khi nhiều tiến trình giao tiếp cùng lúc.
- Tần suất đọc/ghi shared memory cao, thì triển khai rất phức tạp. Không đáng về mặt sử dụng trong trường hợp này.
- Nếu không phải tất cả tiến trình cần truy cập shared memory mà chỉ vài tiến trình, message queues tốt hơn.
- Nếu muốn giao tiếp với các gói dữ liệu khác nhau, ví dụ tiến trình A gửi loại tin nhắn 1 cho B, loại 10 cho C, loại 20 cho D. Message queues đơn giản hơn. Loại tin nhắn có thể là 0, dương hoặc âm.
- Thứ tự message queue là FIFO (First In First Out). Tin nhắn đầu tiên vào hàng đợi là tin nhắn đầu tiên được lấy ra.
Việc dùng Shared Memory hay Message Queues phụ thuộc nhu cầu ứng dụng và hiệu quả sử dụng.
Giao tiếp qua message queues có thể xảy ra theo các cách:
- Một tiến trình ghi vào shared memory, tiến trình khác đọc. Đọc có thể bởi nhiều tiến trình.

Một tiến trình ghi với các gói dữ liệu khác nhau, nhiều tiến trình đọc theo loại tin nhắn.
Sau khi hiểu message queues, kiểm tra system call (System V) hỗ trợ message queues.
Để giao tiếp qua message queues, các bước:
Bước 1 - Tạo message queue hoặc kết nối đến queue đã có (msgget())
Bước 2 - Ghi vào message queue (msgsnd())
Bước 3 - Đọc từ message queue (msgrcv())
Bước 4 - Thao tác điều khiển trên message queue (msgctl())
Tạo hai tiến trình: một ghi, một đọc. Xem reader và writer hoạt động như thế nào dùng shared memory.
Ví dụ Code (Writer)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// cấu trúc cho message queue
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65); // tạo khóa duy nhất
msg_id = msgget(my_key, 0666 | IPC_CREAT); // tạo message queue, trả về id
message.msg_type = 1;
printf("Write Message: ");
fgets(message.msg, 100, stdin);
msgsnd(msg_id, &message, sizeof(message), 0); // gửi tin nhắn
printf("Sent message is: %s \n", message.msg);
}
Ví dụ Code (Reader)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// Định nghĩa cấu trúc message queue
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65); // tạo khóa duy nhất
msg_id = msgget(my_key, 0666 | IPC_CREAT); // tạo message queue, trả về id
msgrcv(msg_id, &message, sizeof(message), 1, 0); // nhận tin nhắn
// hiển thị tin nhắn
printf("Received Message is: %s \n", message.msg);
msgctl(msg_id, IPC_RMID, NULL); // hủy message queue
return 0;
}
Kết quả
