linux进程间的通信之 共享内存

- #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);
- int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
- 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);
- int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
shmid_ds结构至少包含以下成员:
- struct shmid_ds {
- uid_t shm_perm.uid;
- uid_t shm_perm.gid;
- mode_t shm_perm.mode;
- }
- shm_com.h
- #define TEXT_SZ 2048
- struct shared_use_st {
- int written_by_you;
- char some_text[TEXT_SZ];
- };
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/shm.h>
- #include "shm_com.h"
- int main()
- {
- int running = ;
- void *shared_memory = (void *);
- struct shared_use_st *shared_stuff;
- int shmid;
- srand((unsigned int)getpid());
- shmid = shmget((key_t), sizeof(struct shared_use_st), | IPC_CREAT);
- if (shmid == -) {
- fprintf(stderr, "shmget failed\n");
- exit(EXIT_FAILURE);
- }
现在,让程序可以访问这个共享内存:
- shared_memory = shmat(shmid, (void *), );
- if (shared_memory == (void *)-) {
- 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 = ;
- while(running)
- {
- if (shared_stuff->written_by_you)
- {
- printf("You wrote: %s", shared_stuff->some_text);
- sleep( rand() % ); /* make the other process wait for us ! */
- shared_stuff->written_by_you = ;
- if (strncmp(shared_stuff->some_text, “end”, ) == ) {
- running = ;
- }
- }
- }
最后,共享内存被分离,然后被删除:
- if (shmdt(shared_memory) == -)
- {
- fprintf(stderr, "shmdt failed\n");
- exit(EXIT_FAILURE);
- }
- if (shmctl(shmid, IPC_RMID, ) == -)
- {
- fprintf(stderr, "shmctl(IPC_RMID) failed\n");
- exit(EXIT_FAILURE);
- }
- exit(EXIT_SUCCESS);
- }
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/shm.h>
- #include "shm_com.h"
- int main()
- {
- int running = ;
- void *shared_memory = (void *);
- struct shared_use_st *shared_stuff;
- char buffer[BUFSIZ];
- int shmid;
- shmid = shmget((key_t), sizeof(struct shared_use_st), | IPC_CREAT);
- if (shmid == -)
- {
- fprintf(stderr, "shmget failed\n");
- exit(EXIT_FAILURE);
- }
- shared_memory = shmat(shmid, (void *), );
- if (shared_memory == (void *)-)
- {
- 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 == )
- {
- sleep();
- 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 = ;
- if (strncmp(buffer, "end", ) == ) {
- running = ;
- }
- }
- if (shmdt(shared_memory) == -) {
- fprintf(stderr, "shmdt failed\n");
- exit(EXIT_FAILURE);
- }
- exit(EXIT_SUCCESS);
- }
- $ ./shm1 &
- []
- Memory attached at
- $ ./shm2
- Memory attached at
- Enter some text: hello
- You wrote: hello
- waiting for client...
- waiting for client...
- Enter some text:
- You wrote:
- waiting for client...
- waiting for client...
- waiting for client...
- Enter some text: end
- You wrote: end
- $
linux进程间的通信之 共享内存的更多相关文章
- Linux进程间的通信
一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...
- PHP与Linux进程间的通信
进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业).当然非常多公司考的是算法. 不查阅资料,我脑子里能想到的 [1] 管道, (有名.无名) [2] 父子进程 [3] System V (消息队 ...
- Linux进程IPC浅析[进程间通信SystemV共享内存]
Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到 ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
- linux进程间的通信方式
linux进程间的通信 进程间的通信就是不同的进程之间传播或交换信息,进程的用户空间是互相独立,进程之间可以利用系统空间交换信息. 管道 允许将一个进程的标准输出和另一个进程的标准输入连接在一起,主要 ...
- linux 进程通信之 共享内存
共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...
- Windows中利用共享内存来实现不同进程间的通信
Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...
- Nginx之进程间的通信机制(共享内存、原子操作)
1. 概述 Linux 提供了多种进程间传递消息的方式,如共享内存.套接字.管道.消息队列.信号等,而 Nginx 框架使用了 3 种传递消息的传递方式:共享内存.套接字.信号. 在进程间访问共享资源 ...
- Linux 进程通信(共享内存区)
共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...
随机推荐
- CF 671D Roads in Yusland
弄完之后点进去一看,竟然是div1的D题……最近真是天天被题虐哭 推荐这一篇博客 https://www.cnblogs.com/Sakits/p/8085598.html 感觉讲清楚了,也是基本照着 ...
- Luogu 2322 [HNOI2006]最短母串问题
唔,太菜了,弄了好几个小时. 状压dp,设$f_{s, i}$表示选了集合$s$,以$i$结尾的最短长度,设$g_{i, j}$表示串$i$的后缀和串$j$的前缀的最长匹配长度. $f_{s, i} ...
- 几种jar转exe方法的比较
原摘自:https://blog.csdn.net/uikoo9/article/details/7458666 几种jar转exe方法的比较 2012年04月13日 17:33:07 阅读数:153 ...
- 如何把VS2015中本地的一个项目建立远程的Git Repository
在项目开发中,我在本地自己电脑上用VS2015建立了一个项目,比如项目名字叫做Luke.Test 那么,接下来,我如何把这个项目签入到远程的Git Repository里去呢. 方法如下 先进入远程R ...
- url-pattern 的设置与匹配
- [C# 线程处理系列]专题四:线程同步
目录: 一.线程同步概述 二.线程同步的使用 三 .总结 一.线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资 ...
- 算法训练 最大的算式(DP)
问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号 ...
- pandas-如何得到某一个值所在的行
df[df['列名'].isin([相应的值])]
- forEach,for in,for of循环的用法
一.一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,a ...
- 51nod1478(yy)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1478&judgeId=365133 题意: 中文题诶 ...