共享内存同行

一、共享内存概念

  共享内存是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. CentOS 7 运行级别切换

    CentOS 7 之前的版本是通过 /etc/inittab 文件来定义系统运行级别: [sywu@wusuyuan ~]$ cat /etc/centos-release CentOS releas ...

  2. NOSQL概要

    NOSQL概要 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的数据库.NoSQL数据库的四大分类 键值(Key-Value)存储数 ...

  3. gpt格式下通过U盘装win7系统

    首先下好一个64位的win7系统,可以是ghost版的,然后放到你的U盘,在U盘的根目录下添加bootmgr.efi,bootx64.efi.shell.efi这几个文件,其它都不要管,重启,你就在g ...

  4. 【leetcode】Remove Duplicates from Sorted Array II

    Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicate ...

  5. php empty()和isset()

    2015年12月11日 10:59:08 echo phpversion(); //5.6.13 $a = array( 'aaa' => 1, 'bbb' => 0, 'ccc' =&g ...

  6. WIZnet官方网盘

    之前使用过 WIZnet 的TCP/IP 解决方案,资源较少, 偶然发现此网盘,不敢独享,访问 请戳此处.

  7. windows系统下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  8. 掌握VS2010调试 -- 入门指南

    1 导言 在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间.通常,debug是指发现缺 ...

  9. 【linux】学习5

    鸟哥那本书第11章的内容 管理整个计算机硬件的是操作系统的内核(kernel),内核是需要保护的,我们一般用户只能通过shell来跟内核通信.Shell是用户操作系统的接口 cat  /etc/pas ...

  10. C#导出Excel动态列

    一.用StreamWrite流对象,导出Excel 1. string _sPath = GenerateSalaryMonthlyReport(dgvSalarySum); System.Diagn ...