共享内存同行

一、共享内存概念

  共享内存是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的更多相关文章

  1. 信号量互斥,王明学learn

    信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...

  2. 管道通信,王明学learn

    管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4. ...

  3. linux内核的组成,王明学learn

    linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...

  4. ARM伪指令,王明学learn

    ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...

  5. 多进程程序设计,王明学learn

    多进程程序设计 一.函数学习 1.1 创建进程fork 1.1.1 函数原形 pid_t fork(void); 1.1.2 函数功能 创建一个子进程 1.1.3 所属头文件 <unistd.h ...

  6. 库函数系统调用文件方式,王明学learn

    库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...

  7. 静态/动态函数库设计,王明学learn

    静态/动态函数库设计 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别: 一.函数库分类 函数库按照链接方式可分为: 1.静态链接库 对函数库的链接是放在编译时期(com ...

  8. linux应用程序地址布局,王明学learn

    linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...

  9. ARM寻址方式,王明学learn

    ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...

随机推荐

  1. SVN里常见的图标及其含义

    - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽略文件.A file ignored by version con ...

  2. IPC---共享内存

    共享内存就是允许两个或多个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据时,不需要在客户进程和服务器进程之间幅值,因此是最快的一种IPC.不同进程之间共享的内存通常安 ...

  3. Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子

    万事具备,只欠编码! 下面看一个简单的示例,这个示例验证Android手机自带的通讯录的添加联系人的操作是否成功.这个例子是Appium官网自带的示例,有兴趣的同学也可以自己下载来研究和学习,下载地址 ...

  4. ios 在ios9中 NSNotificationCenter addObserver 不会影响对象释放

    如题,ios9上,  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@&qu ...

  5. string literals may have at most 255 elements

    一行中的字符超出 255 时候发生这个错误 解决方式: 一行的字符串分成两行 并 + 连接 **** 将字符串分成两个用"+"连接起来

  6. [转]Android中Application类的用法

    原文链接:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application ...

  7. LINQ查询返回DataTable类型

    个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...

  8. LeetCode 459 Repeated Substring Pattern

    Problem: Given a non-empty string check if it can be constructed by taking a substring of it and app ...

  9. IOS - 控件的AutoresizingMask属性

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. enum {   UIViewAutoresi ...

  10. [Android Pro] synchronized与static synchronized 的区别

    reference to :  http://www.cnblogs.com/shipengzhi/articles/2223100.html 1.synchronized与static synchr ...