100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】
2021/9/10 7:05:11
本文主要是介绍100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
动图:
往共享内存写东西:
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/shm.h> #include <unistd.h> int main() { key_t key = ftok("./", 2101); if(key != -1) { printf("key = %d\n", key); } //创建、打开共享内存 int shmiod = shmget(key, 512 ,IPC_CREAT | 0666); if(shmiod != -1) { printf("shmiod = %d\n", shmiod); } //为共享内存,建立映射 char *str_add = (char *)shmat(shmiod, NULL, 0); //=============== 向共享内存建立映射的地址上'写'东西 =============================// int i = 0; char buf[123] = ""; while(1) { sleep(2); sprintf(buf, "this is %d mesg", i); strcpy(str_add, "hello word"); i++; } sleep(3); shmdt(str_add); //删除共享内存 int shmidctl = shmctl(shmiod, IPC_RMID, NULL); if(shmidctl != -1) { printf("删除成功\n"); } return 0; }
从共享内存读东西:
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/shm.h> #include <unistd.h> int main() { key_t key = ftok("./", 2101); if(key != -1) { printf("key = %d\n", key); } //创建、打开共享内存 int shmiod = shmget(key, 512 ,IPC_CREAT | 0666); if(shmiod != -1) { printf("shmiod = %d\n", shmiod); } //为共享内存,建立映射 char *str_add = (char *)shmat(shmiod, NULL, 0); pid_t pid; int i = 0; for(; i < 3; i++) { pid = fork(); if(pid == 0) { break; } } if(0 == i) { //================== 从共享内存建立映射的地址上读str_add =================================// int x = 0; while (1) { sleep(1); if(str_add != NULL) { printf("子进程 1 第 %d 映射地址建立成功:%s\n", x, str_add); } x++; if(x == 10) { printf("映射信息不在接收-退出\n"); break; } } } else if(1 == i) { int x = 0; while (1) { sleep(1); if(str_add != NULL) { printf("子进程 2 第 %d 映射地址建立成功:%s\n", x, str_add); } x++; if(x == 10) { printf("映射信息不在接收-退出\n"); break; } } } else if(2 == i) { int x = 0; while (1) { sleep(1); if(str_add != NULL) { printf("子进程 3 第 %d 映射地址建立成功:%s\n", x, str_add); } x++; if(x == 10) { printf("映射信息不在接收-退出\n"); break; } } } else { while (1) { pid = waitpid(-1, NULL, WNOHANG); if(pid > 0) { printf("回收的子进程号:%d\n",pid); } else if(pid == 0) { continue; } else break; } } sleep(2); shmdt(str_add);//解除映射 //删除共享内存 int shmidctl = shmctl(shmiod, IPC_RMID, NULL); if(shmidctl != -1) { printf("删除成功\n"); } return 0; }
这篇关于100_进程通信_使用共享内存,发布通知(10条)给到3个进程【向共享内存写、读,创建的消息队列键值,必须一致,打开同一块共享内存】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21MQ-2烟雾传感器详解
- 2024-12-09Kafka消息丢失资料:新手入门指南
- 2024-12-07Kafka消息队列入门:轻松掌握Kafka消息队列
- 2024-12-07Kafka消息队列入门:轻松掌握消息队列基础知识
- 2024-12-07Kafka重复消费入门:轻松掌握Kafka消费的注意事项与实践
- 2024-12-07Kafka重复消费入门教程
- 2024-12-07RabbitMQ入门详解:新手必看的简单教程
- 2024-12-07RabbitMQ入门:新手必读教程
- 2024-12-06Kafka解耦学习入门教程
- 2024-12-06Kafka入门教程:快速上手指南