共享内存同行,王明学learn
共享内存同行
一、共享内存概念
共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式。
二、函数学习
这里主要有创建共享内存、映射共享内存、分离共享内存、控制共享内存
2.1创建/打开共享内存
1).函数名
shmget
2).函数原型
int shmget(key_t key,size_t size,int shmflg)
3).函数功能
创建或者获取共享内存,并返回描述符id
4).所属头文件
<sys/ipc.h><sys/shm.h>
5).返回值
成功:返回创建或者获取到的共享内存
失败:-1
6).参数说明
key:共享内存的键值
size:共享内存的大小
shmflg:打开标志、如果使用了IPC_CREAT,则会新创建一块共享内存
2.2映射共享内存
1).函数名
shmat
2).函数原型
void *shmat(int shmid,const void *shmaddr,int shmflg)
3).函数功能
把shmid指定的共享内存映射到进程的的地址空间里
4).所属头文件
<sys/types.h><sys/shm.h>
5).返回值
成功:返回映射到进程空间之后的内存地址
失败:-1
6).参数说明
shmid:要映射的共享内存的描述符
shmaddr:指定映射之后的地址,但是一般情况都让该参数为NUUL,标明让linux系统自动的选择映射地址
shmflg:标志
2.3分离共享内存
1).函数名
shmdt
2).函数原型
int shmdt(const void *shmaddr)
3).函数功能
从进程地址空间中,断掉与共享内存的联系
4).所属头文件
<sys/types.h><sys/shm.h>
5).返回值
成功:0
失败:-1
6).参数说明
shmaddr:指明要断开共享内存的映射地址
2.4控制共享内存
1).函数名
shmctl
2).函数原型
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
3).函数功能
控制共享内存
4).所属头文件
<sys/ipc.h><sys/shm.h>
5).返回值
成功:根据不同的操作返回不同的值
失败:-1
6).参数说明
shmid:要控制的共享内存的id
cmd:决定执行什么样的控制操作,如使用IPC_RMID表示删除
buf:获取linux中描述共享内存的shmid_ds结构,基本不使用
三、共享内存通信
3.1write进程主要完成创建共享内存----->映射共性内存----->脱离共享内存这几个任务
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> #define TEXT_SIZE 2048
struct shared_use_st
{
int written_buy_you;
char some_text[TEXT_SIZE];
}; int main()
{
int running = ;
struct shared_use_st *shared_stuff;
int shmid;
char buffer[TEXT_SIZE]; //1创建共享内存
shmid = shmget((key_t),sizeof(struct shared_use_st),IPC_CREAT);
if(shmid==-)
{
printf("creat share memory fail!\n");
exit(EXIT_FAILURE);
} //2映射共享内存
shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,); //3循环
while(running)
{
while(shared_stuff->written_buy_you == )
{
sleep();
printf("wait read process!\n");
} //获取用户输入
fgets(buffer,TEXT_SIZE,stdin); //将用户输入的字符串放入共享内存
strncpy(shared_stuff->some_text,buffer,TEXT_SIZE);
shared_stuff->written_buy_you = ; if(strncmp(buffer,"end",)==)
running =;
} //4脱离共享内存
shmdt((const void *)shared_stuff); return ;
}
3.2read进程主要完成创建/获取共享内存------>映射共享内存-------->循环打印共享内存中的字符串----->直到结束----->脱离共享内存------>删除共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> #define TEXT_SIZE 2048
struct shared_use_st
{
int written_buy_you;
char some_text[TEXT_SIZE];
}; int main()
{
int shmid;
struct shared_use_st *shared_stuff;
int running = ;
//获取共享内存
shmid = shmget((key_t),sizeof(struct shared_use_st),IPC_CREAT); //映射共享内存
shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,);
//循环
while(running)
{
//打印共享内存
if(shared_stuff->written_buy_you == )
{
printf("write process write %s\n",shared_stuff->some_text);
shared_stuff->written_buy_you = ; if(strncmp(shared_stuff->some_text,"end",)==)
running = ;
}
}
//脱离共享内存
shmdt((const void *)shared_stuff); //删除共享内存
shmctl(shmid,IPC_RMID,);
return ;
}
四、编译read.c和write.c运行./read和write可以得到write打印出的字符如图所示,write输入end时候read和write进程同时结束


共享内存同行,王明学learn的更多相关文章
- 信号量互斥,王明学learn
信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...
- 管道通信,王明学learn
管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4. ...
- linux内核的组成,王明学learn
linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...
- ARM伪指令,王明学learn
ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...
- 多进程程序设计,王明学learn
多进程程序设计 一.函数学习 1.1 创建进程fork 1.1.1 函数原形 pid_t fork(void); 1.1.2 函数功能 创建一个子进程 1.1.3 所属头文件 <unistd.h ...
- 库函数系统调用文件方式,王明学learn
库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...
- 静态/动态函数库设计,王明学learn
静态/动态函数库设计 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别: 一.函数库分类 函数库按照链接方式可分为: 1.静态链接库 对函数库的链接是放在编译时期(com ...
- linux应用程序地址布局,王明学learn
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
- ARM寻址方式,王明学learn
ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...
随机推荐
- centos7删除已经安装的docker
centos下可以使用yum来删除docker. 列出docker包的具体的名字. $ yum list installed | grep docker docker-engine.x86_64 -0 ...
- map的使用
@Override public List<Map<String, Object>> findSchedule(Date beginTime, Date endTime, Lo ...
- 密码加SALT原理
原来这个技术叫SALT,以前我们经常这么用 ============================================================================== ...
- [转]Android How to Download and Make Volley.jar
原文来自:http://tips.androidhive.info/2015/08/android-how-to-download-and-make-volley-jar/ 1 Comment . ...
- 比较两个mysql数据库表结构的差异
需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...
- HTML5 video 支持air play
< video src="/path/to/video.mp4" x-webkit-airplay="allow" preload controls> ...
- 无限轮播的N+2 策略
N张照片把contentsSize设置为N+2个图片的宽度,例子如下,两端填充如图,当处于一端时,且即将进入循环状态的时候,如第二张图,从状态1滑动到状态2,在滑动结束的时候,将当前的位置直接转到状态 ...
- iOS-消息推送机制的实现
OS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器 ...
- 'XCTest/XCTest.h' file not found
直接写解决方法吧:在报错的 Target 中的 Building Settings 中 Framework Search Paths 里面添加 $(PLATFORM_DIR)/Developer/Li ...
- XStream xml to bean
<!-- pom.xml --> <dependency> <groupId>com.thoughtworks.xstream</groupId> &l ...