PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=024)

  本文发布于 2016-07-20 16:16:28,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=024)

环境说明

Linux 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

前言


  1. IPC---Inter-Process Communication(进程间通信)
  2. UNIX 与 LINUX 没有直属血缘关系,是一个新创建的操作系统。LINUX可以说成参考MINIX(一个类UNIX系统,中间的缘由可以由自己百度)自己写的一个操作系统系统。
  3. System V 是一个UNIX 系统的分支。POSIX是一个IEEE定制的一个标准。(可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ))。
  4. IPC 的种类很多,大概有一下几种:
    • A 原始的UNIX IPC
    • B 在A的基础上进化出System V IPC
    • C 在A的基础上进化出Socket IPC
    • D 由IEEE协会制定的POSIX标准中的IPC
    • E 由A,B,C,D 综合发展得到Linux IPC

IPC


Linux IPC

  由于一些历史原因,现在的linux内核里面常见的就是System V 和 Posix的通信。至于Socket IPC 已经被Linux 独立出来,叫做Linux 网络通信,其实本质上还是IPC,只不过由单机IPC,变为了多机IPC.(主要还是由tcp/ip协议作为支撑)

System V IPC
  1. System V IPC主要包括:System V消息队列、System V信号灯、System V共享内存区。
  2. System V IPC 有一个很明显的特征,那就是有一个关键字能够代表这个IPC,很明显这个关键字必须唯一的。得到这个关键字的方法有多种,但是我只用过一种,那就是用ftok()得到。
  3. API集合
    • A System V消息队列

      • msgget()根据key与flag访问或者创建IPC对象。
      • msgctl()控制与销毁IPC对象
      • msgsnd/msgrcv()发送/接受消息
    • B System V信号灯
      • semget()根据key与flag访问或者创建IPC对象。
      • semctl()控制与销毁IPC对象
      • semop()操作IPC对象,也就是PV操作实现
    • C System V共享内存区
      • shmget()根据key与flag访问或者创建IPC对象。
      • shmctl()控制与销毁IPC对象
      • shmat()连接共享内存
      • shmdt()与共享内存分离
Posix IPC

  Posix IPC的的特征也很明显,与System V对比。首先API命名改变。是由IPC名称_IPC操作构成。其次是以一个名字作为标识符标示一个IPC对象。如信号量族:sem_open()/sem_close()/sem_trywait()/sem_post()

  • A Posix 信号量(命名信号量,未命名信号量(亲缘进程通信))

    • sem_open()/sem_close() 信号量打开或者创建。/信号量关闭。
    • sem_wait()/sem_trywait() V操作
    • sem_post()P 操作
    • sem_unlink()删除信号量
    • sem_getvalue()获取值
    • sem_init()未命名信号量初始化
    • sem_destory()未命名信号量销毁
  • B Posix 共享内存
    • shm_open()/shm_unlink()打开内存区域/删除内存区域
    • ftruncate()清空内存区域
    • fstat()通过文件描述符获取文件对应的属性。文件打开后这样操作.
    • mmap()映射数据(文件)到当前进程空间
    • munmap()与mmap相反
  • C Posix 消息队列
    • mq_open()/mq_close()同上可得
    • mq_unlink()同上可得
    • mq_getattr()/mq_setattr()设置或得到mq的属性
    • mq_send()同英文含义
    • mq_receive()同英文含义
    • mq_notify()同英文含义
IPC 之管道

  管道分为命名管道和非命名管道,此概率可类比Posix 信号量。

  • unamepipe API:

    • pipe()建立匿名管道
  • namedpipe/fifo API:
    • mkfifo() 建立一个有名管道
    • unlink() 删除有名管道
  • 管道操作:
    • read()/write()

后记


  从上面我们可以看到posix ipc比 system v 使用起来简单。但是也有一些不足。我们平时都是综合应用这些东西,就能够很好的完成工作了。当然,现在越来越倾向与写Posix IPC,因为方便移植。

  友情提示:我们在使用前,应该多看看帮助文档,因为可以少让你踩很多坑。

参考文献


打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

Linux IPC(进程间通信)摘要(信号灯,共享内存,消息队列,管道)(一)的更多相关文章

  1. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  2. Linux进程间通信(七):消息队列 msgget()、msgsend()、msgrcv()、msgctl()

    下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提 ...

  3. c/c++ linux 进程间通信系列6,使用消息队列(message queue)

    linux 进程间通信系列6,使用消息队列(message queue) 概念:消息排队,先进先出(FIFO),消息一旦出队,就从队列里消失了. 1,创建消息队列(message queue) 2,写 ...

  4. Linux下多任务间通信和同步-消息队列

    Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...

  5. 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

    在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...

  6. Linux进程间通信之《共享内存》入门

    目录 简述 代码 写端代码 读取端代码 编译 运行 简述 共享内存是Linux系统进程间通信常用的方式,通常用于数据量较大的情况,如果只是用于不同的进程间消息通知,那不如用消息队列或者socket.之 ...

  7. Linux进程间通信(System V) --- 共享内存

    共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...

  8. linux c编程:Posix共享内存区

    Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...

  9. linux网络编程之posix共享内存

    今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...

  10. linux 两个进程通过 共享内存 通信例子

    例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...

随机推荐

  1. Linux如何禁用透明大页

    环境: RHEL 6.5 + Oracle 11.2.0.4 RAC 1.确认透明大页是否开启 grep HugePage /proc/meminfo cat /sys/kernel/mm/redha ...

  2. [转载自jayant97] nRF9160与nRF Cloud 超详细入门攻略

    原文链接:nRF9160与nRF Cloud 超详细入门攻略 1. 产品简介 1.1. nRF Cloud ​ nRF Cloud是Nordic Semiconducotr公司在AWS上搭建的IoT平 ...

  3. RPA AI .NET Core 与未来--学习笔记

    摘要 当下 RPA 平台主要采用 .NET Framework 框架,也限制了 RPA 只用于 Windows 平台..NET Core 的开放与跨平台特性赋予 RPA 更大发展空间. RPA是什么 ...

  4. NC24608 [USACO 2011 Ope S]Learning Languages

    题目链接 题目 题目描述 Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent i ...

  5. springboot jpa自定义SQL查询

    说明 在使用JPA实现数据持久化过程中经常会遇到这种情况:我有2张表是一对多的关系,需要通过一个外键ID去关联查询到另外一张表的字段.例如,1张商品表food_info其中存有商品分类ID categ ...

  6. jar not loaded. See Servlet Spec 3.0, section 10.7.2 Offending class: javax/servlet/Servlet

    说明: 今天在整合activemq功能时启动应用模块报错: jar not loaded. See Servlet Spec 3.0, section 10.7.2 Offending class: ...

  7. 【Android 逆向】【攻防世界】ill-intentions

    1. apk 安装到手机, 啥输入框都没有 2. apk拖入到jadx中看看 public class MainActivity extends Activity { @Override // and ...

  8. 吐血分享一套iOS底层面试题,真心想帮你!!!

    一 选择题(单选/多选) 1. 在LP64下,一个指针的有多少个字节 A: 4 B: 8 C: 16 D: 64 答案B解析: 1个指针8字节 2. 一个实例对象的内存结构存在哪些元素 A:成员变量 ...

  9. 【Azure Redis】PHPRedis遇见SSL Connection Timeout问题

    问题描述 PHP Redis客户端遇见使用SSL Connection timeout,遇见问题后,切换回去Non-SSL没有出现问题.但是切换回SSL后,还是偶尔遇见Connection timeo ...

  10. 【Azure 应用服务】在创建App Service时,遇见“No available instances to satisfy this request. App Service is attempting to increase capacity.”错误

    问题描述 在创建新的App Service,遇见了资源不满足当前需求的提示.详细消息为: "Code": "Conflict","Message&qu ...