linux进程间的通信(C): 共享内存
- #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);
- struct shmid_ds {
- uid_t shm_perm.uid;
- uid_t shm_perm.gid;
- mode_t shm_perm.mode;
- }
- #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 = 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->some_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);
- }
- #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);
- }
- $ ./shm1 &
- [1] 294
- Memory attached at 40017000
- $ ./shm2
- Memory attached at 40017000
- 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进程间的通信(C): 共享内存相关推荐
- Linux进程间的通信----->共享内存
共享内存: 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物 ...
- 深刻理解 Linux 进程间七大通信(IPC)
前言 网络编程是 Linux C/C++的面试重点,今天我就来聊一聊进程间通信的问题,文章末尾列出了参考资料,希望帮助到大家. 篇幅有点长,希望大家耐心阅读. Linux 下的进程通信手段基本上是从 ...
- MFC:通过代码简单理解进程间的通讯机制——共享内存
下面用共享映射文件的方式实现进程间通信,代码可以运行. 一.浅理解 每个进程有自己独立的空间,一个进程无法访问其他进程的数据.就好像两个是互不干涉的个体,想让它们进行通信(交换数据),就必须有一段它们 ...
- linux进程间的通信实验,linux实验进程之间的通信.doc
院 系: 计算机学院 实验课程:linux内核设计与实现 实验项目:进程之间的通信 指导老师:冯刚 开课时间: 2010 - 2011 年度第 2 学期 专 业:计算机科学与技术(师范) 班 级:2班 ...
- linux共享内存示例,linux 进程间共享内存示例
写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...
- Linux C 进程间的IPC通信 之 共享内存(一)
1.IPC(inter - process communication)通信 共享内存.消息队列.信号灯 2.库 <sys/shm.h> 2-1 创建共享内存 int shmget( k ...
- 进程间的通信——共享内存
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- Linux 进程间通讯(IPC)方式 ------- 共享内存
Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...
- android 进程间的通信,Android native进程间通信实例-binder结合共享内存
在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kerneldriversstagingandroidashmem.c.但是本篇文章不是讲解android共享内存的功能实现原 ...
最新文章
- php 预订义变量,预约义变量 PHP
- Shiro 核心功能案例讲解 基于SpringBoot 有源码
- Docker容器间通讯,直接路由方式实现网络通讯
- php 导出csv文件
- stm32 薄膜键盘原理_铅锤哥:市面上的笔记本键盘优缺点解析,看完秒懂
- 百度智呼吸 html5,手机百度 iBreath智呼吸
- app.config中的值获取及设置 以及对log4net配置
- 【图像分割】基于matlab GUI多种阈值图像分割(带面板)【含Matlab源码 733期】
- python模拟三次输入密码_python 3.0 模拟用户登录功能并实现三次错误锁定
- ngx_http_upstream_module模块学习笔记
- 挑战性题目DSCT103:客观指标评价问题
- Nmap扫描机器开放的端口
- ModifyStyle ModifyStyleEx修改自定义控件的问题
- P.W.N. CTF - MISC - Canadian FOI
- 漫威 DC 英雄综合实力排位,这人秒杀灭霸
- 知识图谱下图神经网络、图计算、图数据、图数据库未来发展趋势如何?
- 版号解禁,网络游戏却未解冻
- 股票/期货分仓系统都能实现什么功能?
- 结算系统业务监控实践
- 【洛谷P1255 数楼梯】
热门文章
- python 用while输出数字金字塔_用Python实现一个Dual Thrust数字货币量化交易策略
- 涡轮流量计说明书_实际应用中超声波流量计与电磁流量计哪个更好用
- 未发现oracle(tm)客户端和网络组件_SpringColud Eureka的服务注册与发现
- linux应用程序安装PPT免费序,linux下应用程序安装的总结
- 1043 输出PATest(PAT乙级 C++)
- 什么是节点光端机?总线型光端机有哪些优势?
- [渝粤教育] 郑州商学院 商学概论 参考 资料
- 【渝粤教育】国家开放大学2018年秋季 0434-22T高级英语口语 参考试题
- 【渝粤教育】广东开放大学 数据库原理与应用 形成性考核 (1)
- 【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案