透過共享記憶體進行程序間通訊(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 }
輸出
廣告