1、共享内存生产者(写入者)
在Linux中,使用共享内存通常通过 shmget
、shmat
和 shmdt
系统调用来实现。这些系统调用用于创建共享内存段、将其附加到进程的地址空间以及在不再需要时将其分离。
生产者进程创建一个共享内存段,将数据写入共享内存中。
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#define SHM_KEY 1234 // 共享内存键值
#define SHM_SIZE 1024 // 共享内存段的大小
int main() {
// 创建共享内存段
int shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget失败");
exit(1);
}
// 将共享内存段附加到进程的地址空间
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat失败");
exit(1);
}
// 向共享内存写入数据
strcpy(shm_ptr, "Hello from shared memory!");
printf("写入者: 数据写入共享内存: %s\n", shm_ptr);
// 分离共享内存
if (shmdt(shm_ptr) == -1) {
perror("shmdt失败");
exit(1);
}
return 0;
}
2、共享内存消费者(读取者)
消费者进程读取共享内存中的数据并显示。
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#define SHM_KEY 1234 // 共享内存键值
#define SHM_SIZE 1024 // 共享内存段的大小
int main() {
// 访问共享内存段
int shm_id = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shm_id == -1) {
perror("shmget失败");
exit(1);
}
// 将共享内存段附加到进程的地址空间
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat失败");
exit(1);
}
// 从共享内存读取数据
printf("读取者: 从共享内存读取的数据: %s\n", shm_ptr);
// 分离共享内存
if (shmdt(shm_ptr) == -1) {
perror("shmdt失败");
exit(1);
}
return 0;
}