Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

IPC qua bộ nhớ chia sẻ (Shared Memory) trong C++

Bộ nhớ chia sẻ (Shared memory) là bộ nhớ dùng chung giữa hai hoặc nhiều tiến trình. Tuy nhiên, tại sao cần chia sẻ bộ nhớ hoặc phương tiện giao tiếp khác?

Lặp lại: mỗi tiến trình có không gian địa chỉ riêng, nếu tiến trình muốn giao tiếp thông tin từ không gian địa chỉ của nó đến tiến trình khác, chỉ có thể qua kỹ thuật IPC (inter process communication). Giao tiếp có thể giữa tiến trình liên quan hoặc không liên quan.

Thường, giao tiếp tiến trình liên quan dùng Pipe hoặc Named Pipe. Tiến trình không liên quan (ví dụ một chạy terminal này, một chạy terminal kia) dùng Named Pipe hoặc các kỹ thuật IPC phổ biến: Shared Memory và Message Queues.

Đã xem Pipe và Named pipe, giờ đến các IPC còn lại: Shared Memory, Message Queues, Semaphores, Signals, Memory Mapping.

IPC qua bộ nhớ chia sẻ (Shared Memory) trong C++

Để giao tiếp giữa hai hoặc nhiều tiến trình, ta dùng shared memory nhưng trước khi dùng, cần làm gì với system calls:

  • Tạo đoạn shared memory hoặc dùng đoạn đã tạo (shmget())
  • Gắn tiến trình vào shared memory đã tạo (shmat())
  • Tách tiến trình khỏi shared memory đã gắn (shmdt())
  • Thao tác điều khiển trên shared memory (shmctl())

Tạo hai tiến trình: một ghi, một đọc. Xem reader và writer hoạt động như thế nào qua shared memory.

Ví dụ Code (Writer)

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;

int main() {
  key_t my_key = ftok("shmfile", 65); // ftok tạo khóa duy nhất
  int shmid = shmget(my_key, 1024, 0666 | IPC_CREAT); // shmget trả về id trong shmid
  char *str = (char*) shmat(shmid, (void*)0, 0); // shmat gắn vào shared memory
  cout << "Write Data: ";
  fgets(str, 50, stdin);
  printf("Data written in memory: %s\n", str);
  // tách khỏi shared memory
  shmdt(str);
}

Ví dụ Code (Reader)

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;

int main() {
  key_t my_key = ftok("shmfile", 65); // ftok tạo khóa duy nhất
  int shmid = shmget(my_key, 1024, 0666 | IPC_CREAT); // shmget trả về id
  char *str = (char*) shmat(shmid, (void*)0, 0); // shmat gắn vào shared memory
  printf("Data read from memory: %s\n", str);
  shmdt(str);
  shmctl(shmid, IPC_RMID, NULL); // hủy shared memory
}

Kết quả

IPC qua bộ nhớ chia sẻ (Shared Memory) trong C++