Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

IPC ด้วย Message Queues

ทำไมต้องใช้ 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) IPC ด้วย Message Queues
  • Process หนึ่งเขียน shared memory ด้วย data packets ต่างๆ หลาย process อ่านตาม message type IPC ด้วย Message Queues

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;
}

ผลลัพธ์

IPC ด้วย Message Queues