透過共享記憶體進行程序間通訊(IPC)


共享記憶體是兩個或多個程序之間共享的記憶體區域。但是,為什麼我們需要共享記憶體或其他一些通訊方式呢?

重申一下,每個程序都有自己的地址空間,如果任何程序想要與其自身地址空間中的某些資訊與其他程序通訊,那麼只有使用IPC(程序間通訊)技術才能實現。正如我們已經知道的那樣,通訊可以在相關或不相關的程序之間進行。

通常,相關程序的通訊使用管道或命名管道來執行。不相關的程序(例如,一個程序在一個終端執行,另一個程序在另一個終端執行)可以使用命名管道或透過共享記憶體和訊息佇列等流行的IPC技術來進行通訊。

我們已經看到了管道和命名管道的IPC技術,現在是時候瞭解其餘的IPC技術了,即共享記憶體、訊息佇列、訊號量、訊號和記憶體對映。

我們知道,要在兩個或多個程序之間進行通訊,我們使用共享記憶體,但在使用共享記憶體之前,需要對系統呼叫做什麼,讓我們來看看:

  • 建立共享記憶體段或使用已建立的共享記憶體段 (shmget())

  • 將程序附加到已建立的共享記憶體段 (shmat())

  • 將程序從已附加的共享記憶體段分離 (shmdt())

  • 控制共享記憶體段上的操作 (shmctl())

在這裡,我們將建立兩個程序。一個可以寫入,另一個可以讀取。讓我們看看使用共享記憶體的讀取器和寫入器程序是如何工作的。

示例程式碼

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   cout<<"Write Data : ";
   fgets(str, 50, stdin);
   printf("Data written in memory: %s\n",str);
   //detach from shared memory
   shmdt(str);
}

示例程式碼

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   printf("Data read from memory: %s\n",str);
   shmdt(str);
   shmctl(shmid,IPC_RMID,NULL); // destroy the shared memory
}

輸出

更新於:2019年7月30日

3K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告