共享内存同行

一、共享内存概念

  共享内存是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. How to keep Environment Variables when Using SUDO

    The trick is to add environment variables to sudoers file via sudo visudo command and add these line ...

  2. ASP.NET 上的 Async/Await 简介

    原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...

  3. InstallUtil在windows服务中的使用(转)+ 服务安装的注意事项

    1.  新建一个Windows Service的方法: 1. 打开Visual Studio 2008新建一个project Solution: 2. 选择Windows->windows Se ...

  4. Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码

    本文转载自 Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码 oracle 下载还需要用户名我自己注册了个方便大家使用下载直接点击提示找不到 ...

  5. Oracle语句优化之一

    public List<TdDepartment> createZtreeDep(String compId) { List<TdDepartment> dd = new Ar ...

  6. event.srcElement 用法笔记e.target

    event.srcElement 可以捕获当前事件作用的对象,如event.srcElement.tagName可以捕获活动标记名称. 注意获取的标记都以大写表示,如"TD",&q ...

  7. September 6th 2016 Week 37th Tuesday

    I only wish to face the sea, with spring flowers blossoming. 我只愿面朝大海,春暖花开. That scenery is beautiful ...

  8. August 26th 2016 Week 35th Friday

    It always seems impossible until it's done. 在事情未完成之前,一切都看似不可能. When I was young, once I had to lift ...

  9. object实现小老鼠交互

    直接使用 <p style="text-align: center; "> <object type="application/x-shockwave- ...

  10. 解决eclipse manven项目添加不了maven dependencis

    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"& ...