为了传输结构体,我们可以使用C++中的共用体(union)。共用体允许使用相同的内存位置来存储不同的数据类型。我们可以创建一个带有共享内存缓冲区的管道类,一个进程将数据写入共享缓冲区,另一个进程将数据从缓冲区中读取。
以下是一个C++代码示例:
#include
#include
#include
#include
#include
#include
#include
#include
#include
// 定义一个包含结构体和整型数据的共用体
union Data {
struct my_struct {
char name[20];
int age;
} info;
int number;
};
class Pipe {
public:
Pipe() {
key_t key = ftok("./", 'a'); // 创建键值
m_shmId = shmget(key, sizeof(Data), 0666 | IPC_CREAT); // 创建共享内存
m_data = (Data*)shmat(m_shmId, 0, 0); // 获取指向共享内存的指针
m_data->number = 0; // 初始化整型变量
}
void writeStruct(struct my_struct data) {
memcpy(&m_data->info, &data, sizeof(my_struct)); // 将结构体复制到共用体中
}
int readNumber() {
return m_data->number; // 读取共用体中的整型变量
}
struct my_struct readStruct() {
return m_data->info; // 读取共用体中的结构体
}
~Pipe() {
shmdt((void*)m_data); // 解除指向共享内存的指针
shmctl(m_shmId, IPC_RMID, NULL); // 删除共享内存
}
private:
int m_shmId;
Data* m_data;
};
int main() {
Pipe p; // 创建管道对象
// 向共享内存中写入结构体数据
struct my_struct data = {"Alice", 20};
p.writeStruct(data);
// 向共享内存中写入整型数据
int num = 10;
memcpy(&p.m_data->number, &num, sizeof(int));
// 读取共享内