写数据进程代码
// writer.cpp
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstring>
#include <unistd.h>
int main()
{
// 使用ftok()生成一个唯一的键用来标识共享内存,shmfile需要是一个存在的文件,也可以用其他方法来生成用来标识共享内存的key,但是要确保这个key是唯一的
key_t key = ftok("shmfile", 16);
if (key == -1)
{
perror("ftok()");
return -1;
}
// 创建共享内存
int shmid = shmget(key, 1024, 0666 | IPC_CREAT);
if (shmid < 0)
{
perror("shmget()");
return -1;
}
// 将共享内存连接到当前进程地址空间
void *ptr = shmat(shmid, nullptr, 0);
if (ptr == (void *)-1)
{
perror("shmat()");
return -1;
}
// 写入数据
char buf[] = "System V Shared Memory test";
memcpy(ptr, buf, sizeof(buf));
// 等待输入,只是为了读进程能来得及读数据
getchar();
// 关闭共享内存到当前进程地址空间的连接
shmdt(ptr);
// 删除共享内存
shmctl(shmid, IPC_RMID, nullptr);
return 0;
}
读数据进程代码
// reader.cpp
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
int main()
{
// key需要和写进程保持一致
key_t key = ftok("shmfile", 16);
if (key == -1)
{
perror("ftok()");
return -1;
}
// 获取共享内存
int shmid = shmget(key, 1024, 0666);
if (shmid < 0)
{
perror("shmget()");
return -1;
}
// 将共享内存连接到当前进程地址空间
void *ptr = shmat(shmid, nullptr, 0);
if (ptr == (void *)-1)
{
perror("shmat()");
return -1;
}
// 读出数据
std::cout << "data:" << (char *)ptr << std::endl;
// 关闭共享内存到当前进程地址空间的连接
shmdt(ptr);
return 0;
}
标签:共享内存,return,示例,System,C++,key,shmid,include,ptr
From: https://blog.csdn.net/2401_85919417/article/details/143312921