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> # ...
随机推荐
- ABC270F 题解
和博客园一样好的体验 思路 首先看到花最小代价使得所有点连通,果断转换成最小生成树问题. 接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权.因为一个点飞或者 ...
- FDMemTable用法
procedure TForm1.FormCreate(Sender: TObject); Var i:integer; begin // i:=15; self.FDMemTable1.FieldD ...
- Hadoop-Operation category READ is not supported in state standby 故障解决
在查询hdfs时或者执行程序向hdfs写入数据时遇到报错:Operation category READ is not supported in state standby 意思是:该主机状态为待机, ...
- Spring Boot 单元测试笔记
1. 导入JUnit5测试框架 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- Delphi 实现刘谦春晚魔术
看了博友的C# 实现刘谦春晚魔术很好,改成了delphi版的. 1 program Project1; 2 3 {$APPTYPE CONSOLE} 4 {$R *.res} 5 6 uses 7 S ...
- Innodb存储引擎之锁
目录 一.概述 二.lock 与 latch 三.Innodb存储引擎中的锁 锁 一致性非锁定读 一致性锁定读 自增长与锁 外键与锁 四.锁的算法 锁的算法 Phantom Problem 幻读问题 ...
- SpringBoot下Akka的简单使用
SpringBoot下Akka的简单使用 Akka框架实现一个异步消息传输,通过定义演员来处理业务逻辑. 首先引入依赖 <!-- akka --> <dependency> & ...
- 【Android 逆向】【ARM汇编】 事前更新和事后更新
1. 事前更新,事后更新,不更新 不更新 ldr R4, [R1, R2, lsl #1] 相当于 R4 = *(R1 + R2 << 2^1) 之后 R1.R2的值时没有变化的 事前更新 ...
- 搜索引擎RAG召回效果评测MTEB介绍与使用入门
RAG 评测数据集建设尚处于初期阶段,缺乏针对特定领域和场景的专业数据集.市面上常见的 MS-Marco 和 BEIR 数据集覆盖范围有限,且在实际使用场景中效果可能与评测表现不符.目前最权威的检索榜 ...
- CentOS8安装Geant4笔记(二):CentOS8安装Qt5.15.2并测试运行环境
前言 在服务器CentOs8.2上安装geant4软件,但是运行不起来,所以本节开始主要是安装qt,测试qt基本功能. 要点 添加qt环境到系统环境中,是geant4启动qt的必要条件. ...