C语言之共享内存之shmget进程间通信(二十三)
一、 shm_open()和shmget()区别
1.shm_open主要打开一个共享内存用户进程间交换大量数据。
用法:
把共享内存以文件方式打开,这样就可以直接向文件中写入数据.
2.shmget:共享内存用于进程间通信。共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。
用法:
<1>.获取到一个内存区,KEY相同情况下,各进程访问的是同一块内存。造型为指定类型后,直接操作访问。<2>.访问进程间要加锁。这个锁也必须是共享内存锁。
写数据时,结构体中的缓冲区必须是已经声明足够大小,而不是一个指针需要时malloc。因为malloc的地址,
其他进程访问不到。得到一个内存区, KEY相同情况下,各进程访问的是同一块内存。造型为指定类型后,直接
操作访问。注意:<3>.访问进程间要加锁。这个锁也必须是共享内存锁。
写数据时,结构体中的缓冲区必须是已经声明足够大小,而不是一个指针需要时malloc。因为malloc的地址,
其他进程访问不到。
1.向共享内存写数据
# emacs write_shm.c
#include <stdio.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>int main(int argc, char **argv) {int shmid;int i = 0;char *pshm;char buf[1024];//创建一块共享内存:1000:起始地址,size:10240shmid = shmget(1000, 10240, 0666 | IPC_CREAT);if(shmid < 0 )fprintf(stderr, "create share memory error\n");//pshm指针指向内存区域(0,0)pshm = (char*)shmat(shmid, 0, 0);if(pshm == NULL)fprintf(stderr, "attach shm error\n");printf("input node 0-9\n");scanf("%d", &i);printf("node is %d\n", i);memset(buf, 0, sizeof(buf));printf("input data\n");scanf("%s", buf);//向共享内存写buf数据memcpy(pshm + i*20, buf, 20);//指针解除绑定,进程结束系统会释放共享内存对物理地址得映射shmdt(pshm);return 0;
}
2.从共享内存中读数据
# emacs read_shm.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/shm.h>int main(int argc, char **argv) {int i;char *pshm;char buf[1024];int shmid;//创建一块共享内存:1000:起始地址,size:10240shmid = shmget(1000, 10240, 0666 | IPC_CREAT);if(shmid < 0 )fprintf(stderr, "create share memory error\n");//pshm指针指向内存区域(0,0)pshm = (char*)shmat(shmid, 0, 0);if(pshm == NULL)fprintf(stderr, "attach shm error\n");printf("input node 0-9\n");scanf("%d", &i);printf("node is %d\n",i);memset(buf, 0, 1024);//从共享内存中读数据bufmemcpy(buf, pshm + i*20, 20); fprintf(stderr,"data [%s]\n",buf);//指针解除绑定,进程结束系统会释放共享内存对物理地址得映射shmdt(pshm);return 0;
}
C语言之共享内存之shmget进程间通信(二十三)相关推荐
- c语言中shmget相关函数,共享内存函数(shmget、shmat、shmdt、shmctl)及其范例 - guoping16的专栏 - 博客频道 - CSDN...
2014年4月2日共享内存函数(shmget.shmat.shmdt.shmctl)及其范例 - guoping16的专栏 - 博客频道 - http://doc.xuehai.net 登录 | 注册 ...
- Windows Mobile使用Shared Memory(共享内存)进行IPC(进程间通信)的开发
背景 在Unix-like系统进行IPC(Inter-process communication)通信,Shared memory是效率最高的,我称之为IPC的王中王. 简介 本文讲述在Windows ...
- Linux进程间通信(七)---共享内存之shmget()、shmat()、shmdt()及其基础实验
/********************************************************************* * 2019年6月26日声明:本博客资源下载积分最开始为免 ...
- shmget物理内存_共享内存 mmap shmget 区别
请参考apache对于共享内存的scoreboard的初始化,ap_init_scoreboard() 得有一个内存变量ap_scoreboard_image来索引对应的共享内存 By firewor ...
- C语言之共享内存shm_open(二十五)
在多个进程之间交换数据,在多个进程之间交换数据,最高效的方法莫过于共享内存. linux共享内存是通过tmpfs这个文件系统来实现的,tmpfs文件系的目录为/dev/shm,/dev/s ...
- shmget物理内存_Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()...
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- 进程间通信:共享内存概念及代码
前言 接下讨论的IPC机制,它们最初由System V版本的Unix引入.由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制.接下来的内容包括: 信号量 ...
- c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存
1. 什么是共享内存 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是 ...
最新文章
- 低代码、无代码?深度解读硅谷新趋势(上)
- QIIME 2教程. 31名词Glossary(2021.2)
- Xilinx 在文档中所用的 LC(logic cells) 与 LUT之间的换算关系
- Ubuntu安装MySQL1 - 失败
- python -使用del语句删除对象引用
- 事务不在活跃oracle,MYSQL性能优化笔记_2
- vue中select选择框的监听事件
- 【转】eclipse 查看原始类出现The jar file rt.jar has no source attachment解决方法
- ADMM随堂笔记(3):一致和协同
- Detours Hook初探
- 全民一起VBA提高篇 专题1 第二回 变体终非万全策,数字要分长短型
- ACSII,GB2312,GBK,GB18030,Unicode,UTF8,UTF16,UTF32,BOM区别与转换——字符编码最全总结
- kafka eagle的介绍和详细安装教程
- Tkinter 的text使用方法
- Eclipse开发必备干货分享
- 使用servlet提供接口
- 【数据分析】数据分析方法论
- 张朝阳不再狂妄,搜狐的艰难复苏路
- ESP32-C3 迷你智能语音照明
- android创意软件,手机解锁也好玩 Android软件创意解锁