进程通信(共享内存)

共享内存:

用于进程间数据传输,是最高效的,并不提供同步,互斥

 shm.h:
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/ipc.h>
  4 #include<sys/shm.h>
  5 #include<string.h>
  6 #include<sys/wait.h>
  7 #include <unistd.h>
  8 
  9 
 10 #define _PATH_ "."
 11 #define _PROJ_ID 0x666
 12 #define SIZE  4096
 13 
 14 int shm_create();
 15 int shm_get();
 16 void* at_shm(int shm_id);
 17 int destroy_shm(int );
 18 int delete_shm(void*);
 
 shm.c:
 
  1 #include "shm.h"
  2 int com_shm_create(int flags)
  3 {
  4   key_t key=ftok(_PATH_,_PROJ_ID);
  5   if(key<0)
  6   {
  7     perror("ftok");
  8     return -1;
  9   }
 10   int _shm_id=shmget(key,SIZE,flags);
 11    if(_shm_id<0)
 12   {
 13    perror("shmget");
 14    return -1;
 15   }
 16  return _shm_id;
 17 }
 18 int shm_create()
 19 {
 20   return com_shm_create(IPC_CREAT|IPC_EXCL|0666);
 21 }
 22 int shm_get()
 23 {
 24 
 25   return com_shm_create(IPC_CREAT);
 26 
 27 }
 28 void* at_shm(int _shm_id)
 29 {
 30  return shmat(_shm_id,NULL,0);
 31 }
 32 int destroy_shm(int _shm_id)
 33 {
 34   return shmctl(_shm_id,IPC_RMID,NULL);
 35 }
 36 int delete_shm(void* addr)
 37 {
 38   return shmdt(addr);
 39 }

 test.c:
  1 #include "shm.h"
  2 int main()
  3 {
  4     int _shm_id=shm_create();
  5     pid_t pid=fork();
  6     if(pid<0)
  7     {
  8         perror("fork");
  9         return -1;
 10     }
 11     else if(pid ==0)
 12     {
 13         int _shm_id=shm_get();
 14         char* str=(char*)at_shm(_shm_id);
 15         char* s="we are young";
 16         strcpy(str,s);
 17         sleep(5);
 18         delete_shm(str);
 19     }
 20     else
 21     {
 22         char* str=(char*)at_shm(_shm_id);
 23         sleep(5);
 24         printf("%s",str);
 25 
 26         delete_shm(str);
 27         waitpid(pid,NULL,0);
 28         destroy_shm(_shm_id);
 29 
 30     }
 31     return 0;
 32 }
 
 Makefile:
  1 SHM:shm.c test.c
  2     gcc -o [email protected] $^
  3 .PHONY:clean
  4 clean:
  5     rm -f SHM
  
  结果:
 [[email protected] SHM]$ ./SHM
we are young[[email protected] SHM]$
时间: 2024-10-19 12:51:55

进程通信(共享内存)的相关文章

Linux程序设计学习笔记----System V进程通信(共享内存)

转载请注明出处:http://blog.csdn.net/suool/article/details/38515863 共享内存可以被描述成内存一个区域(段)的映射,这个区域可以被更多的进程所共享.这是IPC机制中最快的一种形式,因为它不需要中间环节,而是把信息直接从一个内存段映射到调用进程的地址空间. 一个段可以直接由一个进程创建,随后,可以有任意多的进程对其读和写.但是,一旦内存被共享之后,对共享内存的访问同步需要由其他 IPC 机制,例如信号量来实现.象所有的System V IPC 对象

Windows进程通信 -- 共享内存

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

Windows进程通信 -- 共享内存(1)

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

Windows进程通信-共享内存空间

三个模块 1,game.exe,三个方法,控制台输入指令('A','B','R')分别控制三个方法的调用: 2,WGDll.dll,要注入到game进程中的dll文件: 3,myconsole.exe,用来注入dll文件的程序: 先开启game进程,然后用myconsole把dll注入到game,dll模块和myconsole模块利用共享内存实现进程通信,在myconsole的控制台输入指令,dllmokuai接受指令,调用game模块的方法,达到控制game的目的 game模块 #includ

Linux学习笔记(14)-进程通信|共享内存

共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址. 就好像它们是由用C语言malloc()分配的内存一样.

进程通信之内存共享篇

进程通信之_ 内存共享 概念:共享内存是被多个进程共享的一部分物理内存.共享内存是进程间的共享数最快的方法,一个进程向共享内存区域写入数据,共享这个内存区域的所有进程就可以写入数据,所有进程就可以立刻看到其中的内容. 实现步骤;1.创建共享内存,使用shmget函数2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数 创建:int shmget (key_t key,int size,int shmflg)key 标识内存功效的键值0/ipc_private.成功返回

Windows进程间共享内存通信实例

抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把硬盘或页文件上的目标文件映射到这段虚拟内存中.注意:在程序实现中必须考虑各进程之间的同步问题. 在Windows操作系统下,任何一个进程不允许读取.写入或是修改另一个进程的数据(包括变量.对象和内存分配等),但是在某个进程内创建的文件映射对象的视图却能够为多个其他进程所映射,这些进程共享的是物理存储器的同一个页面. 因

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存

进程-IPC 共享内存和消息队列 (三)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%89).md 五 共享内存 5.1. 共享内存简介 共享内存指多个进程共享同一块物理内存,它只能用于同一台机器上的两个进程之间的通信.在进程的逻辑地址空间中有一段地址范围是用来进行内存映射使用的,该段逻辑地址空间可以映射到共享的物理内存地址上(进程空间介绍:http://blog.csdn.net/zhangzhebjut/article/details/3906025

Linux Linux程序练习十五(进程间的通信共享内存版)

/* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进程把接受的值进行打印. 提示:用sigqueue和sigaction实现 * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include &