Linux IPC(进程间通信)摘要(信号灯,共享内存,消息队列,管道)(一)
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
前言
- IPC---Inter-Process Communication(进程间通信)
- UNIX 与 LINUX 没有直属血缘关系,是一个新创建的操作系统。LINUX可以说成参考MINIX(一个类UNIX系统,中间的缘由可以由自己百度)自己写的一个操作系统系统。
- System V 是一个UNIX 系统的分支。POSIX是一个IEEE定制的一个标准。(可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ))。
- 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
- System V IPC主要包括:System V消息队列、System V信号灯、System V共享内存区。
- System V IPC 有一个很明显的特征,那就是有一个关键字能够代表这个IPC,很明显这个关键字必须唯一的。得到这个关键字的方法有多种,但是我只用过一种,那就是用ftok()得到。
- 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()与共享内存分离
- A System V消息队列
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(进程间通信)摘要(信号灯,共享内存,消息队列,管道)(一)的更多相关文章
- Linux IPC实践(10) --Posix共享内存
1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...
- Linux进程间通信(七):消息队列 msgget()、msgsend()、msgrcv()、msgctl()
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提 ...
- c/c++ linux 进程间通信系列6,使用消息队列(message queue)
linux 进程间通信系列6,使用消息队列(message queue) 概念:消息排队,先进先出(FIFO),消息一旦出队,就从队列里消失了. 1,创建消息队列(message queue) 2,写 ...
- Linux下多任务间通信和同步-消息队列
Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...
- Linux进程间通信之《共享内存》入门
目录 简述 代码 写端代码 读取端代码 编译 运行 简述 共享内存是Linux系统进程间通信常用的方式,通常用于数据量较大的情况,如果只是用于不同的进程间消息通知,那不如用消息队列或者socket.之 ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
- linux c编程:Posix共享内存区
Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...
- linux网络编程之posix共享内存
今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...
- linux 两个进程通过 共享内存 通信例子
例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...
随机推荐
- Linux如何禁用透明大页
环境: RHEL 6.5 + Oracle 11.2.0.4 RAC 1.确认透明大页是否开启 grep HugePage /proc/meminfo cat /sys/kernel/mm/redha ...
- [转载自jayant97] nRF9160与nRF Cloud 超详细入门攻略
原文链接:nRF9160与nRF Cloud 超详细入门攻略 1. 产品简介 1.1. nRF Cloud nRF Cloud是Nordic Semiconducotr公司在AWS上搭建的IoT平 ...
- RPA AI .NET Core 与未来--学习笔记
摘要 当下 RPA 平台主要采用 .NET Framework 框架,也限制了 RPA 只用于 Windows 平台..NET Core 的开放与跨平台特性赋予 RPA 更大发展空间. RPA是什么 ...
- NC24608 [USACO 2011 Ope S]Learning Languages
题目链接 题目 题目描述 Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent i ...
- springboot jpa自定义SQL查询
说明 在使用JPA实现数据持久化过程中经常会遇到这种情况:我有2张表是一对多的关系,需要通过一个外键ID去关联查询到另外一张表的字段.例如,1张商品表food_info其中存有商品分类ID categ ...
- 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: ...
- 【Android 逆向】【攻防世界】ill-intentions
1. apk 安装到手机, 啥输入框都没有 2. apk拖入到jadx中看看 public class MainActivity extends Activity { @Override // and ...
- 吐血分享一套iOS底层面试题,真心想帮你!!!
一 选择题(单选/多选) 1. 在LP64下,一个指针的有多少个字节 A: 4 B: 8 C: 16 D: 64 答案B解析: 1个指针8字节 2. 一个实例对象的内存结构存在哪些元素 A:成员变量 ...
- 【Azure Redis】PHPRedis遇见SSL Connection Timeout问题
问题描述 PHP Redis客户端遇见使用SSL Connection timeout,遇见问题后,切换回去Non-SSL没有出现问题.但是切换回SSL后,还是偶尔遇见Connection timeo ...
- 【Azure 应用服务】在创建App Service时,遇见“No available instances to satisfy this request. App Service is attempting to increase capacity.”错误
问题描述 在创建新的App Service,遇见了资源不满足当前需求的提示.详细消息为: "Code": "Conflict","Message&qu ...