通过共享内存进行进程间通信(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 }
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
输出
广告