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; }