今天学习了相关于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方法即可。

这种方式实现的思路比较简单,适用于数据量较小的通信。而且没有类似于共享内存方式的冲突问题发生。但是速度相对而言比较的慢,有利有弊吧!


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

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

直接消息传递是指接收和发送消息的时候都对相关的进程进行指定。

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


总结


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

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

  1. linux各种IPC机制(进程通信)

    linux各种IPC机制 (2011-07-08 16:58:35)      原文地址:linux各种IPC机制(转)作者:jianpengliu 原帖发表在IBM的developerworks网站 ...

  2. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

  3. Nginx 进程间如何共享内存

    L:37 Nginx 针对多进程用的是自旋锁(占用共享内存时间比较短的情况下否则可能会影响性能)注:自旋锁是不停的请求共享内存 而原先的信号量是等待占用者释放后通知等待的进程

  4. 20155202 张旭 课下作业: Linux下IPC机制

    20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...

  5. (转)Linux环境进程间通信系列(五):共享内存

    原文地址:http://www.cppblog.com/mydriverc/articles/29741.html 共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A ...

  6. 20155239吕宇轩 Linux下IPC机制

    20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...

  7. [转帖]linux各种IPC机制

    linux各种IPC机制 docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/detai ...

  8. linux各种IPC机制

    docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原 ...

  9. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

随机推荐

  1. mac下IDLE无法输入中文的问题

    解决方法是下载安装新版本的 Tcl/Tk 下载地址:http://www.activestate.com/activetcl/downloads 注意要下最新的8.5.18.0版本,安装好了再重启ID ...

  2. Requests库介绍

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  3. Centos下出现read-only file system 的解决办法

    Centos下出现这种情况说明磁盘只能读不能写,出现这种情况一般是因为不正常的关机或者硬盘损坏导致磁盘挂载出现问题. 本萌新也遇到了这个问题,尝试了各种命令都不行,最后用了mount -o remou ...

  4. html表单验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. jquery form submit提交后无反应 不报错

    jquery form onSubmit默认返回false 因为页面添加了validate验证,在刷新页面后重新提交需要加上下一行代码 onSubmit:function() {return true ...

  6. QRCode.js:使用 JavaScript 生成二维码

    什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 JavaScript 库.主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 基本用法 ...

  7. 传统方法过渡到ES6去优雅地实现JavaScript的继承

    众所周知,面向对象编程有三个重要的概念: 封装.继承.多态.而JS作为面向对象的弱类型语言,应该说是基于对象的语言,正如常说的,JS的世界里,万物皆对象.虽然JS本身不是面向对象的语言,我们可以通过模 ...

  8. node安装教程

    推荐安装教程博客: https://www.cnblogs.com/zhouyu2017/p/6485265.html

  9. ACM Curling 2.0

    在行星MM-21上,今年奥运会之后,冰壶(curling)越来越受欢迎.  但规则与我们有所不同. 该游戏是在冰盘上进行的,在冰棋盘上标有方形网格.他们只用一块石头. 游戏的目的是以最少的动作( th ...

  10. JavaSE基础问答

    1.JAVA的基本数据类型有哪些? JAVA的基本数据类型分为4类8种,就是整形 byte.short.int.long.浮点型 float 跟double,字符型 char,跟布尔型 true和 f ...