共享内存同行,王明学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寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...
随机推荐
- ubuntu 16.04 apt-get error: in the drive /media/cdrom and press
If you have an internet connection, you can safely comment out the line starting with deb cdrom: ... ...
- How to mount a NFS share?
Assume you have a NFS share /data/shares/music, at server: 192.168.1.5 You can mount the NFS share f ...
- [20160707]Java中如何关闭Frame窗口
用户类继承自WindowAdapter,而窗口对象Frame作为用户类的数据成员. 1 import java.awt.*; import java.awt.event.*; public class ...
- C#之系统自带保存属性
源代码下载链接 程序开发很多时候需要根据运行环境做不通的参数配置,通过写ini之类的文本文件是一种方法,但这种方法也同时会把数据暴露 Winform开发中可以将需要配置的字段属性保存到程序中(其实也是 ...
- vim python设置
http://www.cnblogs.com/Leo-Forest/archive/2012/04/06/2435237.html http://linux-wiki.cn/wiki/zh-hans/ ...
- DataTemplate应用
在WPF中,决定数据外观的是DataTemplate,即DataTemplate是数据内容的表现形式,一条数据显示成什么样子,是简单的文本还是直观的图形,就是由DataTemplate决定的.下面通过 ...
- 算法手记 之 数据结构(线段树详解)(POJ 3468)
依然延续第一篇读书笔记,这一篇是基于<ACM/ICPC 算法训练教程>上关于线段树的讲解的总结和修改(这本书在线段树这里Error非常多),但是总体来说这本书关于具体算法的讲解和案例都是不 ...
- Effective C++ -----条款46:需要类型转换时请为模板定义非成员函数
当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”.
- WCF重写ServiceHost,实现独立配置文件
有时我们需要将WCF的配置文件放在单独的配置文件中,而默认情况下WCF又是在web.config或app.config中去寻找服务配置.如果我们把配置文件放在另一个config文件中,如何让WCF知道 ...
- IOS- 堆和栈 详解
Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就 ...