进程间通信 通过共享内存是一个概念,两个或多个进程可以访问公共内存。通信是通过共享内存完成的,其中一个进程所做的更改可以被另一个进程查看。
管道、fifo和消息队列的问题在于,两个进程之间需要交换信息。这些信息必须经过内核。
- 服务器读取输入文件。
- 服务器使用管道、fifo或消息队列将这些数据写入消息中。
- 客户机从IPC通道读取数据,再次要求将数据从内核的IPC缓冲区复制到客户机的缓冲区。
- 最后,从客户机的缓冲区复制数据。
总共需要四份数据副本(两份读取和两份写入)。因此,共享内存提供了一种方法,让两个或多个进程共享一个内存段。使用共享内存时,数据只复制两次——从输入文件复制到共享内存,从共享内存复制到输出文件。
使用的系统调用包括:
ftok() :用于生成唯一密钥。
shmget() :int shmget(键、大小、intshmflg);成功完成后,shmget()返回共享内存段的标识符。
shmat() :在使用共享内存段之前,您必须连接自己 使用shmat()将其删除。void*shmat(int shmid,void*shmaddr,int shmflg); shmid是共享内存id。shmaddr指定要使用的特定地址,但我们应该设置 将其设置为零,操作系统将自动选择地址。
shmdt() :处理完共享内存段后,程序应该 使用shmdt()将自身与它分离。int shmdt(无效*shmaddr);
shmctl() :当您从共享内存中分离时,它不会被销毁。所以,摧毁 使用shmctl()。shmctl(int shmid,IPC_RMID,NULL);
写入进程的共享内存
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using
namespace
std;
int
main()
{
// ftok to generate unique key
key_t key = ftok(
"shmfile"
,65);
// shmget returns an identifier in shmid
int
shmid = shmget(key,1024,0666|IPC_CREAT);
// shmat to attach to shared memory
char
*str = (
char
*) shmat(shmid,(
void
*)0,0);
cout<<
"Write Data : "
;
gets
(str);
printf
(
"Data written in memory: %s"
,str);
//detach from shared memory
shmdt(str);
return
0;
}
读卡器进程共享内存
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using
namespace
std;
int
main()
{
// ftok to generate unique key
key_t key = ftok(
"shmfile"
,65);
// shmget returns an identifier in shmid
int
shmid = shmget(key,1024,0666|IPC_CREAT);
// shmat to attach to shared memory
char
*str = (
char
*) shmat(shmid,(
void
*)0,0);
printf
(
"Data read from memory: %s"
,str);
//detach from shared memory
shmdt(str);
// destroy the shared memory
shmctl(shmid,IPC_RMID,NULL);
return
0;
}
输出: