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> # ...
随机推荐
- Odoo—货运管理—主表获取明细表数据计算结果
在开发货运管理模块的时候,用到了两张表:主表[waybill]和明细表[waybill.detail],主表存放运单主体信息,明细表存放运单货物信息,如下图所示. 上图中红色方框标记的是明细表中行内的 ...
- RocketMQ—RocketMQ发送同步、异步、单向、延迟、批量、顺序、批量消息、带标签消息
RocketMQ-RocketMQ发送同步.异步.单向.延迟.批量.顺序.批量消息.带标签消息 发送同步消息 生产者发送消息,mq进行确认,然后返回给生产者状态.这就是同步消息. 前文demo程序就是 ...
- Wamp MySQL 报错 Got a packet bigger than 'max_allowed_packet' bytes
点击电脑右下角wamp图标,然后进入mysql 下面的 my.ini 转移数据发现报这个错,字面意思允许的不够大.网上很多说法不起作用,解决方法如下: [mysqld] port=3306 expli ...
- Power BI 5 DAY
目录 Power BI 数据建模与数据汇总分析 多维数据模型 搭建多维数据模型 搭建方法 注意事项 搭建数据模型思考 数据变量类型 主键ID特点(非空不重复) 星型结构 交叉筛选器方向 单一/两个 连 ...
- pyhotn3.8 apt机器基础镜像构建
FROM python:3.8.10-slim RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/source ...
- duilib 入坑
记录 duilib 开发遇到的问题 当前最新的 duilib 版本更新是在 2019-4-28-2,从 vcpkg 查询得知 我的机器是 windows 10,vs2019 我是从 duilib 库 ...
- 2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸的道路,“y下“表示这个道路的下限,“y上“表示这个道路的上限, 给定一批长方形,每一个长方形有(
2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, "y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,& ...
- 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...
- 【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
问题描述 在App Service for Linux环境中,部署PHP应用,使用Nginx服务器.因为PHP应用中所有静态资源的URL使用的默认域名为 https://example.com:808 ...
- C#实现图片对比
前言 虽然已经正式转JAVA了,但最近发现一个特别好的开源项目masuit,不仅提供很多简便的功能,还有图像的一些特殊操作功能. 下面就实现一个简单图像对比. 实现对比 代码如下,实现一个可以对比翻转 ...