Linux 基于IPC机制实现进程间的共享内存处理

今天学习了相关于IPC(InterProcess Communication ,进程间通信)的相关知识。就做个笔记,一来让大家检查一下我的理解方面是不是有错误,二来也为了能让更多的博友们了解到相关的知识吧。


IPC的种类



IPC 的种类,一般来说下面两种使用的较多:
- 共享“内存”
- 消息传递



下来我们就分别的介绍一下相关的信息吧。

共享内存



字面意思的理解是采用共享一块计算机中的内存空间来实现的进程之间的通信的一种方式。也就是说这块内存区域驻留在生成共享内存段进程的地址空间。(是存在于用户态内核的区域的)其他进程通过对此块空间的数据进行读写操作来完成相应的通信所需。
好处:进程的通信会非常的快;
缺点:由于不同进程可以对这块共享内存进行操作,就有可能导致数据的读写冲突,或者得到的数据有可能会不一致!



下面是一个实现了进程之间通过共享内存的方式实现进程通信的一个小例子:
首先我们先普及一下相关的函数的具体的细节:
前提是记得引入相关的头文件哦(代码中已标出)

//通过系统调用获得一个共享内存区域
shmget(IPC_PRIVATE,                //生成一个新的共享内存片段
                 size,             //共享内存区的大小
                S_IRUSR | S_IWUSR  //读写操作共享内存区
                ); int             //该函数返回一个整形值

//通过系统调用将要访问内存空间的进程加入到共享内存空间的地址
shmat(
        id,          //希望加入的内存片段的整数标识值
        NULL,        //NULL代表操作系统为用户选择共享内存位置
        0            //0代表可以对共享内存进行读和写的操作
        ); char*     //该函数将返回一个指针,指向共享内存区的内存的初始位置
//将要操作的数据写入到共享内存的空间中
sprintf(
        shared_memory,    //写入数据的目的地的指针
        string            //写入的数据,可以通过变换写入自己的想要的数据类型
        );
//分离出共享内存区域
shmdt(shared_memory);
//借助系统调用,把标志IPC_RMID和共享内存段的标识符一起做为参数,移除!
shmctl();
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
// use for InterProcess Communication
#include<sys/shm.h>
#include<sys/stat.h>
#include<sys/wait.h>
// the global const variable
int value = 5 ;

int main()
{
    pid_t pid ;

    /**
            begin the interprocess communication system call
    */
    const int Size = 2048 ;
    int segment_id =  shmget(IPC_PRIVATE , Size , S_IRUSR | S_IWUSR) ;
    char* shared_memory = (char*) shmat(segment_id, NULL, 0) ;
    pid = fork();

    if(pid == 0 ){
        value += 15 ;
        sprintf(shared_memory,"%d" , value );
        printf("Value from Children : %d\n",value) ;
        /**almostly we will add the return statement at the end of the child process to make sure the code return correctly.*/
        return 0;
       /** printf("Child  value : %d",value);*/
    }else if (pid > 0 ){
        /** wait all the child end ,then notify the parent process */
        wait(NULL);
        /**sprintf(shared_memory,"%d" , value );*/
    }

    /** check the result of the shared_memory */
    printf("Value from Parent  : %s" , shared_memory) ;

    /**to make sure deattach the shared_memory*/
    shmdt(shared_memory) ;

    /**remove the shared memory segment also */
    shmctl(segment_id ,IPC_RMID , NULL) ;

    return 0;
}

程序运行的结果如下:


消息传递方式



底层是在内核态创建一个缓冲区,需要进行通信的进程将数据写入缓冲区,然后对方借助系统调用的方式获取到数据,由此来实现进程之间的通信的方法!主要实现send方法和receive方法即可。
这种方式实现的思路比较简单,适用于数据量较小的通信。而且没有类似于共享内存方式的冲突问题发生。但是速度相对而言比较的慢,有利有弊吧!



内部的实现同样也有两种:

  • 直接的消息传递
  • 间接的消息传递(也成为邮箱模式)


直接消息传递是指接收和发送消息的时候都对相关的进程进行指定。
而间接的消息传递是指将消息都发送到一个“公共邮箱”,大家都可以进行数据的获取!前者比较适合于一对一的模式,后者则适用于一对多的通信。


总结



对于进程间的通信,里面可谓是有很大的学问。上面介绍的也不过是冰山一角而已。如果您发现文章中有不恰当的地方,欢迎指正。谢谢!

时间: 2024-09-20 11:41:14

Linux 基于IPC机制实现进程间的共享内存处理的相关文章

Linux 进程间通讯共享内存方式

共享内存方式:从物理内存里面拿出来一部分作为多个进程共享. 共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容. 共享内存实现步骤: 一.创建共享内存,使用shmget函数. 二.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数. 创建共享内存shmget: intshmget(key_t key, size_t size, int shmflg) 功能:得到一个共享内存标识符或创建一个共享内存对象并

关于linux使用动态库进行进程间通讯

问题描述 关于linux使用动态库进行进程间通讯 各位: 两个进程间通过动态库的方式如何进行参数的传递? 我首先在一个库中做了如下的内容: #include ""caculate.h""#include ""stdio.h""int iShare; #pragma data_seg (""shareddate"")int iShareInSeg = 1;#pragma data_seg#

单台服务器的PHP进程之间实现共享内存的方法_php技巧

开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项. IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法.基本的IPC处理机制有3种:它们分别是共享内存.信号量和消息队列.本文中我们主要讨论共享内存和信号量的使用. 在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法.如果你

进程通信系列-共享内存

共享内存是最简单的方法,但要注意是要限制长度,只能是定长的,而且要加以判断有没有获取过 共享内存类: #include "stdafx.h" #include "share.h" #pragma data_seg("have_jxy")//共享数据段还有种方法是内存映射 char m[2000]="";//必须是定长,不然会卡死 #pragma data_seg() #pragma comment(linker,"/

进程通信-qt共享内存问题,我这里老不能正常判断。

问题描述 qt共享内存问题,我这里老不能正常判断. 在程序的main函数中调用改函数,为什么每次输出都是"create"啊,难道已经存在同样key值的内存也可以创建成功? void testShareMem() { QSharedMemory sharedmem("aa"); if (!sharedmem.create( 512, QSharedMemory::ReadWrite)) qDebug() << "is create already

ipcs与Linux共享内存的示例

一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高.共享内存可以通过mmap()映射普通文件机制来实现,也可以System V共享内存机制来实现,System V是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信,也就是说每个共享内存区域对应特殊文件系统shm中的一个文件. 二.共享内存原理

Linux环境进程间通信共享内存

由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件.实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域.而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存

线程及 进程间的通信问题! .

一个很好的编程随想的博客http://program-think.blogspot.com/2009/03/producer-consumer-pattern-0-overview.html 架构设计:生产者/消费者模式[0]:概述  1.如何确定数据单元2.队列缓冲区3.环形缓冲区4.双缓冲区 生产 消费 2010-06-01 10:13   #include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp>

PHP中实现进程间通讯

进程 PHP中实现进程间通讯 邱文宇   本文将讨论在PHP4环境下如何使用进程间通讯机制--IPC(Inter-Process-Communication).本文讨论的软件环境是linux+php4.0.4或更高版本.首先,我们假设你已经装好了PHP4和UNIX, 为了使得php4可以使用共享内存和信号量,必须在编译php4程序时激活shmop和sysvsem这两个扩展模块. 实现方法:在PHP设定(configure)时加入如下选项. --enable-shmop --enable-sysv