Linux系统下-进程间通信(共享内存-详解)
来源:互联网 发布:全网vip电影源码 编辑:程序博客网 时间:2024/06/17 19:34
1、共享内存
共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下:
共享内存的实现分为两个步骤:
一、 创建共享内存,使用shmget函数。
二、 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
创建共享内存
int shmget(key_t key ,int size,int shmflg)
key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget将创建一块新的共享内存;如果key的取值为0,而参数中又设置了IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功,返回共享内存表示符,如果失败,返回-1。
映射共享内存
int shmat(int shmid,char *shmaddr,int flag)
参数:
shmid:shmget函数返回的共享存储标识符
flag:决定以什么样的方式来确定映射的地址(通常为0)
返回值:
如果成功,则返回共享内存映射到进程中的地址;如果失败,则返回-1。
共享内存解除映射
当一个进程不再需要共享内存时,需要把它从进程地址空间中多里。
int shmdt(char *shmaddr)
shm2.c 生产者程序
通过它向消费者程序输入数据。
1.#include <unistd.h>2.#include <stdlib.h>3.#include <stdio.h>4.#include <string.h>5.6.#include <sys/shm.h>7.8.#include "shm_com.h"9.10.int main()11.{12. int running = 1;13. void *shared_memory = (void *)0;14. struct shared_use_st *shared_stuff;15. char buffer[BUFSIZ];16. int shmid;17.18. shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);19. if (shmid == -1) 20. {21. fprintf(stderr, "shmget failed\n");22. exit(EXIT_FAILURE);23. }24.25. shared_memory = shmat(shmid, (void *)0, 0);26. if (shared_memory == (void *)-1) 27. {28. fprintf(stderr, "shmat failed\n");29. exit(EXIT_FAILURE);30. }31.32. printf("Memory attached at %X\n", (int)shared_memory);33.34. shared_stuff = (struct shared_use_st *)shared_memory;35. while(running) 36. {37. while(shared_stuff->written_by_you == 1) 38. {39. sleep(1);40. printf("waiting for client...\n");41. }42. printf("Enter some text: ");43. fgets(buffer, BUFSIZ, stdin);44.45. strncpy(shared_stuff->some_text, buffer, TEXT_SZ);46. shared_stuff->written_by_you = 1;47.48. if (strncmp(buffer, "end", 3) == 0) {49. running = 0;50. }51. }52.53. if (shmdt(shared_memory) == -1) {54. fprintf(stderr, "shmdt failed\n");55. exit(EXIT_FAILURE);56. }57.58. exit(EXIT_SUCCESS);59.}
0 0
- Linux系统下-进程间通信(共享内存-详解)
- linux进程间共享内存通信详解
- linux进程间共享内存通信详解
- Linux 进程间通信: 共享内存(下)
- Linux环境进程间通信(五): 共享内存(下)(系统V)
- Linux环境进程间通信 共享内存(下)
- Linux环境进程间通信之共享内存(下)
- Linux环境进程间通信--共享内存(下)
- Linux环境进程间通信: 共享内存(下)
- Linux环境进程间通信---共享内存(下)
- Linux进程间通信(五): 共享内存(下)
- linux 进程间通信----共享内存(下)
- Linux进程间通信 —— 共享内存(下)
- Linux下进程通信之共享内存
- Linux系统编程——进程间通信:共享内存
- 【Linux系统编程】进程间通信--共享内存
- Linux系统编程——进程间通信:共享内存
- linux下进程间共享内存通信的问题
- Cable Modem技术详解
- R 数据类型
- Objective-C如何把UTF-8字符串转换为十六进制数
- 【切图】实用小技巧!PS切图后图片大小过大怎么办?
- android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案
- Linux系统下-进程间通信(共享内存-详解)
- ubuntu14.04.3下wifi连接不上获取连接不稳定
- php执行shell不阻塞方法
- android自定义view(一)
- lucene学习之分词信息
- LeetCode Surrounded Regions
- 企业全方位改进(CMMI)咨询服务
- android开发的逗逼事件
- spring集成JSR-303验证框架--Hibernate-validator实现