读取两个共享内存的数据并拼接为一个结构体数组的代码
时间: 2024-02-01 19:13:16 浏览: 89
以下是一个示例代码,假设有两块共享内存分别为shmid1和shmid2,每块内存中存储了相同大小的结构体数组,需要将这两块内存中的数据拼接成一个结构体数组:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
typedef struct {
int id;
char name[20];
} Student;
int main()
{
int shmid1, shmid2;
Student *shm1, *shm2, *result;
int i, num1, num2;
// 获取共享内存1
shmid1 = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid1 < 0) {
perror("shmget error");
exit(1);
}
// 获取共享内存2
shmid2 = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid2 < 0) {
perror("shmget error");
exit(1);
}
// 将共享内存1和2附加到当前进程
shm1 = (Student *)shmat(shmid1, NULL, 0);
if (shm1 == (void *)-1) {
perror("shmat error");
exit(1);
}
shm2 = (Student *)shmat(shmid2, NULL, 0);
if (shm2 == (void *)-1) {
perror("shmat error");
exit(1);
}
// 从共享内存1和2中读取数据
num1 = SHM_SIZE / sizeof(Student);
num2 = SHM_SIZE / sizeof(Student);
result = (Student *)malloc((num1 + num2) * sizeof(Student));
if (result == NULL) {
perror("malloc error");
exit(1);
}
for (i = 0; i < num1; i++) {
result[i].id = shm1[i].id;
strcpy(result[i].name, shm1[i].name);
}
for (i = 0; i < num2; i++) {
result[num1 + i].id = shm2[i].id;
strcpy(result[num1 + i].name, shm2[i].name);
}
// 打印拼接后的结果
for (i = 0; i < num1 + num2; i++) {
printf("id:%d, name:%s\n", result[i].id, result[i].name);
}
// 分离共享内存
shmdt(shm1);
shmdt(shm2);
// 删除共享内存
shmctl(shmid1, IPC_RMID, NULL);
shmctl(shmid2, IPC_RMID, NULL);
free(result);
return 0;
}
```
该程序首先创建了两块共享内存,然后将它们附加到当前进程,并从中读取数据。最后将两块内存中的数据拼接为一个结构体数组,并打印出来。最后分离共享内存并删除它们。
阅读全文