今天学习了相关于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. mysql的连接处理过程

      在mysqld_main函数中经过一系列的初始化后,mysql开始监听客户端的连接 mysqld_socket_acceptor->connection_event_loop(); 查看my ...

  2. Python之作业购物车

    作业之购物车优化 购物车优化要求如下: 用户入口: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就 ...

  3. Struts2 之 modelDriven & prepare 拦截器详解

    struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...

  4. event工具集

    eventTool = { // 页面加载完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = ...

  5. node的异常处理

    Node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃.所以,Node的异常处理对于保证系统的稳定运行非常重要. node的处理方法: 1.使用throw语句抛出异常 常用的捕获异 ...

  6. 移动端web开发中对点透的处理,以及理解fastclick如何做到去除300ms延迟

     一.点透问题以及处理办法 开发中遇到一个问题,就是点击layer弹出框的取消按钮之后,按钮下方的click事件就直接触发了.直接看代码: $('.swiper-slide').on('click', ...

  7. Async分析

     1:android在新版本中不允许UI线程访问网络,但是如果需要访问网络又改怎么办呐?这里有很多解决方案,比如新开一个线程,在新线程中进行访问,然后访问数据,返回后可能会更新界面也可能不更新界面,这 ...

  8. C++笔记003:从一个小程序开始

      原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 安装好VS2010后,从第一个小程序开始. 在学习C语言时,我首先输出了一个程序员非常熟悉的对这个世界的问候:hello world! ...

  9. JAVA中接口的使用

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,那么就是接口(interface)了.什么是接口,简单的讲,接口就是抽象类的进一步抽象,这种进一步的抽象只定义了一种规范,而不需要关心具体 ...

  10. java中equal方法总结

    场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法: PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.get ...