共享内存shm*(生产者和消费者)

//heads.h #ifndef HEAD_H #define HEAD_H #include <iostream> #include <sys/shm.h> //share momery #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include "shm_com.h" #endif // HEAD_H
shm_com.h

#ifndef SHM_COM #define SHM_COM #define TEXT_SZ 2048 struct shared_use_st{ int written_by_you; char some_text[TEXT_SZ]; }; #endif // SHM_COM
consumer.cpp

#include "headers.h" using namespace std; //consumer int main() { int running = 1; void *shared_memory = (void *)0; struct shared_use_st *shared_stuff; int shmid; srand((unsigned int)getpid()); shmid = shmget((key_t)1234, sizeof(struct shared_use_st),0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } //sec let sys select shm address, //thi SHM_RND or SHM_RDONLY shared_memory = shmat(shmid, (void *)0, 0); if(shared_memory == (void *)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %X\n",(unsigned int)(long)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; shared_stuff->written_by_you = 0; while (running) { if (shared_stuff->written_by_you) { printf("You wrote: %s", shared_stuff->some_text); sleep(rand()%4); shared_stuff->written_by_you = 0; if (strncmp(shared_stuff->some_text, "end", 3) == 0) { running = 0; } } } //shm devide and rm if(shmdt(shared_memory) == -1){ fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } if(shmctl(shmid, IPC_RMID, 0) == -1){ fprintf(stderr, "shctl(IPC_RMID) failed \n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
producer.cpp

#include "headers.h" using namespace std; //producer int main() { int running = 1; void *shared_memory = (void *)0; struct shared_use_st *shared_stuff; char buffer[BUFSIZ]; int shmid; shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); // if (shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } shared_memory =shmat(shmid, (void *)0, 0); if(shared_memory == (void *)-1){ fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("memory attached at %X\n", (unsigned int)(long)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; while (running) { while (shared_stuff->written_by_you == 1) { sleep(1); printf("waiting for client...\n"); } printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); strncpy(shared_stuff->some_text, buffer, TEXT_SZ); shared_stuff->written_by_you = 1; if(strncmp(buffer, "end", 3) == 0){ running = 0; } } if(shmdt(shared_memory) == -1){ fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } return 0; }
unix编程一书
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!