1. 前言
多进程,总有一些交互要做,不可能各自独立。
这里是最简单的例子。一个写入,一个读取。
一个建立共享内存,写入数据。
一个读取共享内存的内容。
2. 简单例子代码
twriter.cpp 代码如下:
#include
#include
#include
#include
#include
int main()
{
int shm_id;
int *share;
int num;
//1. 创建共享内存
shm_id = shmget (1234, getpagesize(), IPC_CREAT);
if (shm_id == -1) {
perror("shmget()");
}
//2. 获取共享内存在进程中的地址映射,以后可直接使用这个指针
share = (int *)shmat(shm_id, 0, 0);
while(1) {
num = random() % 1000;
//3. 直接向共享内存写入数据
*share = num;
printf("write a random number %d\n", num);
sleep(1);
}
return 0;
}
tread.cpp 代码如下:
#include
#include
#include
#include
#include
int main()
{
int shm_id;
int *share;
//1. 根据key=1234 创建或者获取共享内存
shm_id = shmget (1234, getpagesize(), IPC_CREAT);
if (shm_id == -1) {
perror("shmget()");
}
//2. 获取共享内存在此进程中的地址映射,以后这个指针直接指向共享内存
share = (int *)shmat(shm_id, 0, 0);
while(1) {
sleep(1);
//3. 直接使用共享内存的指针,获取里面的内容
printf("%d\n", *share);
}
return 0;
}
效果演示:
如图所示:两个进程,一个写数据,一个读数据,完成的很好。
很明显,功能已实现。
3. 共享结构体数据
重要的事情说三遍:
最核心的操作是内存复制!
最核心的操作是内存复制!
最核心的操作是内存复制!
尤其在接收端,必须要拷贝到本地的结构体中,本地化才行!!!
twriter.cpp 代码如下:
#include
#include
#include
#include
#include
#include
typedef struct
{
int i;
char ch[1];
float a;
}data, *dataprt;
int main()
{
data stu1;
stu1.i = 12;
stu1.ch[0] = 'a';
stu1.a = 1.2;
int shm_id;
dataprt share;
int num;
shm_id = shmget (1234, getpagesize(), IPC_CREAT);
if (shm_id == -1) {
perror("shmget()");
}
share = (dataprt)shmat(shm_id, 0, 0);
while(1) {
num = random() % 1000;
stu1.i = num;
stu1.ch[0] = 'x';
stu1.a = 12.6;
//*** 内存复制! 这是最核心的操作 ***
memcpy(share, &stu1, sizeof(stu1));
printf("write a share->i : %d\n", share->i);
printf("write a share->ch : %c\n", share->ch[0]);
printf("write a share->a : %f\n", share->a);
sleep(1);
}
return 0;
}
tread.cpp 代码如下:
#include
#include
#include
#include
#include
#include
typedef struct
{
int i;
char ch[1];
float a;
}data, *dataprt;
int main()
{
data sturead;
int shm_id;
dataprt share;
shm_id = shmget (1234, getpagesize(), IPC_CREAT);
if (shm_id == -1) {
perror("shmget()");
}
share = (dataprt)shmat(shm_id, 0, 0);
while(1) {
sleep(1);
//*** 最核心的操作,内存复制 ***
memcpy(&sturead, share, sizeof(sturead));
printf("i : %d\n", sturead.i);
printf("ch : %c\n", sturead.ch[0]);
printf("a : %f\n", sturead.a);
}
return 0;
}
效果如下:
下一步改进:
(1)不需要实时读取共享内容,需要等待信号通知,写完之后,才去读取。
---