Linux程序设计----共享内存
来源:互联网 发布:淘宝网显示手机版 编辑:程序博客网 时间:2024/06/05 02:04
共享内存简介
(1)共享内存---不相关的进程访问同一个逻辑内存
(2)进程将同一段共享内存映射到自己的地址空间中
(3)对共享内存访问的同步控制必须由程序员来负责
基本函数
//共享内存相关函数头文件#include <sys/shm.h>//创建或者获取共享内存,都是通过它实现int shmget(key_t key, size_t size, int shmflg);//创建的共享内存段,将其映射到一个进程的地址空间void *shmat(int shm_id, const void *shm_addr, int shmflg);
//将共享内存从当前进程中分离(并未删除),当前进程不可再用int shmdt(const void *shm_addr);
//共享内存的控制函数,通过cmd值控制int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
实现codes
shm_com.h
#define TEXT_SZ 2048struct shared_use_st { int written_by_you; /* 1,通知进程有共享数据可读 */ char some_text[TEXT_SZ];};
Consume.c
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include "shm_com.h"//定义共享内存中存放的数据结构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); } 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", (int)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 ); /* make the other process wait for us ! */ shared_stuff->written_by_you = 0;
if(strncmp(shared_stuff->som_text, "end", 3) == 0)
running = 0;}}if (shmdt(shared_memory) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);}Produce.c
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/shm.h>#include "shm_com.h"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", (int)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); } exit(EXIT_SUCCESS);}
0 0
- Linux程序设计----共享内存
- Linux程序设计——共享内存
- Linux程序设计——信号量、共享内存和消息队列
- Linux程序设计学习笔记----System V进程通信(共享内存)
- 《Linux程序设计》——信号量、共享内存和消息队列
- linux程序设计——共享内存(第十四章)
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
- Linux程序设计笔记(第14章 信号量、共享内存和消息队列)
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 共享内存
- linux 共享内存--系统V共享内存
- linux 共享内存--System V共享内存
- linux 共享内存与nginx共享内存
- linux内存共享
- Linux的共享内存
- linux 内存共享
- Linux 共享内存
- Linux 共享内存
- Linux共享内存
- 理解const的内存分配
- 最详细的Log4j使用教程
- 开始啦~~~~2017-05-04
- 网站安全-安全策略小结
- Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
- Linux程序设计----共享内存
- zookeeper在solrcloud中的应用
- Error:Could not read XXX\build\intermediates\typedefs.txt (系统找不到指定的文件。)
- reactNative插件总结
- 聊聊HDFS中的副本放置策略和磁盘选择策略间的选择“矛盾”
- 交换机堆叠和集群配置与管理——2
- 关于在非C盘安装VS2017后MFC资源视图路径错误的问题
- Android中的RSA加密解析
- Node.js的URL网址解释的好方法