进程通信之内存共享篇

进程通信之_ 内存共享

概念:共享内存是被多个进程共享的一部分物理内存。共享内存是进程间的共享数最快的方法,一个进程向共享内存区域写入数据,共享这个内存区域的所有进程就可以写入数据,所有进程就可以立刻看到其中的内容。

实现步骤;
1、创建共享内存,使用shmget函数
2、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数

创建:
int shmget (key_t key,int size,int shmflg)
key 标识内存功效的键值0/ipc_private.
成功返回内存标识符;如果失败,返回-1;

映射:

int shmat(int shmid,char *shmaddr,int flag)
参数:
shmid:shmget函数返回的共享存储标识符
flag :决定以什么方式来影射地址
创建成功返回内存映射地址,失败返回-1;
int shmdt(cha *shmaddr)

/*******************实现代码**********************/

//父进程创建一个共享内存区域,向其内写入数据,。

//之后子函数对其共享空间应用

/*****time:2017.3.19 authr :zhangting ****/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define PERM S_IRUSR|S_IWUSR

/* 共享内存 */

int main(int argc,char **argv)
{
         int shmid;
         char *p_addr,*c_addr;
 
         if(argc!=2)
             {
                  fprintf(stderr,"Usage:%s\n\a",argv[0]);
                  exit(1);
             }

/* 创建共享内存 */ 
     if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)

{
                      fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
                      exit(1);
             }

/* 创建子进程 */

if(fork()) // 父进程写
     {
          p_addr=shmat(shmid,0,0);  //创建内存把内存的地址赋值给p_addr
         memset(p_addr,‘\0‘,1024);    //初始化内存地址空间
          strncpy(p_addr,argv[1],1024);  //把参数复制给申请的内存空间
          wait(NULL);                  // 释放资源,不关心终止状态
          exit(0);
     }
 else                                        // 子进程读
     {
      sleep(1); // 暂停1秒  
        c_addr=shmat(shmid,0,0);
      printf("Client get %p\n",c_addr);
          exit(0);
     }
}

时间: 03-19

进程通信之内存共享篇的相关文章

撸代码--linux进程通信(基于共享内存)

1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候要保证子进程退出后,在删除共享内存. 4)子进程完毕读的内容. 效果展示:                 代码展示:           #include <string.h> #include <unistd.h> #include <sys/types.h> #inc

Windows进程通信 -- 共享内存

享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Windows 中是用 FileMapping 实现的,从具体的实现方法上看主要通过以下几步来实现: 1.调用 CreateFileMapping 创建一个内存文件映射对象: HANDLE CreateFileMapping( HANDLE hFile, // handle to file to map

进程通信(二)&mdash;&mdash; 信号量&amp;内存共享

内存共享是进程间常用的通信方式,可以实现两个完全独立的进程通信. 在访问共享内存时,同时需要信号量进行访问控制. 使用ipcs -m命令可以查看系统共享内存,ipce -m + key 可以删除指定的共享内存. 对共享内存操作时,使用信号量对共享内存进行保护,类似与线程中的互斥锁.都可以看做是通过PV操作实现临界资源保护. P:对信号量标记位-1,获取信号量,如果标记位为0,表示有其他进程占用资源,无法获取. V:对信号量标记位+1,释放信号量,将资源释放,给其他进程使用. 信号量和内存共享需要

进程通信之共享内存

共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自

linux_c开发(5-4)进程间通讯_共享内存通讯

共享内存 共享内存 是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快方法,一个进程向共享内存写入了数据,共享这个内存的所有进程就可以立刻看到其中内容. 共享内存实现分为两个步骤 1.创建共享内存,使用shmget函数. 2.映射共享内存,将创建的这段共享内存映射到具体的进程空间去,使用shmat函数. int shmget(key_t key,int size,int shmflg) key标志共享内存的键值:O/IPC_PRIVATE.当key的取值为IPC/PRIVATE

WM_COPYDATA实现进程通信

在用Shuttle ESB完成C++程序和C#程序消息推送时,需要完成C++进程和ESB进程的通信问题. 进程间的通信方式有很多,比如使用内存映射文件.通过共享内存DLL共享内存.使用SendMessage向另一进程发送WM_COPYDATA消息.比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法. 下面讲解如何通过WM_COPYDATA进行进行通信及通信原理. 1.建立SendMessage方法需要引用的数据结构: namespace Entity { public

第七课 进程通信

unix_c_07.txt================第七课 进程通信================一.基本概念------------1. 何为进程间通信~~~~~~~~~~~~~~~~~进程间通信(Interprocess Communication, IPC)是指两个,或多个进程之间进行数据交换的过程.2. 进程间通信分类~~~~~~~~~~~~~~~~~1) 简单进程间通信:命令行参数.环境变量.信号.文件.2) 传统进程间通信:管道(fifo/pipe).3) XSI进程间通信:

进程管理、内存管理、存储管理初步了解

进程管理 进程需要一定的资源(包括CPU时间.内存.文件.I/O设备)以完成其任务.这些资源可以在进程创建时分配给进程,也可以在执行进程时分配给进程.除了在创建时得到各种物理和逻辑资源外,进程还可以接受传输过来的各种初始化数据(输入). 需要注意:程序本省并不是进程,程序是被动的实体,而进程是一个活动的实体. 进程与线程的定义: 进程是具有一定独立功能的程序关于某个数据集合上的依次运行活动,进程是系统进行资源分配和调度的独立单位. 线程是进程的一个实体,是CPU和分配的基本单位.线程自己基本不拥

进程通信(转)

1.定义: 进程通讯是指进程之间的信息交换. 在进程之间要传送大量数据时,就需要使用进程通讯. 进程互斥和同步需要交换一定的信息,它们也可归为进程通讯,属于低级的进程通讯.低级的原因在于 (1).效率低,生产者每次只能向缓冲池投放一个产品(消息),消费者每次只能从缓冲池中取得一个消息 (2).通讯对用户不透明,OS职位进程之间的通讯提供了共享存储其. 2.进程通讯特点: 使用方便.OS隐藏了实现进程通讯的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可方便的直接利用它实现进程之间