嵌入式Linux系统编程学习之十八进程间通信(IPC)简介
Linux 下的进程通信手段基本上是从 UNIX 平台上的进程通信手段继承而来的。而对 UNIX 发展做出过重大贡献的两大主力 —— AT&T 的贝尔实验室和 BSD (加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者是对 UNIX 早期的进程间通信手段进行了系统的改进和扩充,形成了 “system V IPC” ,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接字 (socket) 的进程间通信机制。而 Linux 则把两者的优势都继承了下来;
UNIX 进程间通信方式包括管道、FIFO 以及信号。
System V 进程间通信包括 System V 消息队列、System V 信号量以及 System V 共享内存区。
Posix 进程间通信包括 Posix 消息队列、Posix 信号量以及 Posix 共享内存区。
Linix 进程之间的通信主要有下面几种:
- 管道和命名管道:管道用于有亲缘关系的进程间的通信,命名管道还允许无亲缘关系进程间通信;
- 信号:在软件层模拟中断机制,通知进程某事发生;
- 消息队列:消息的链表包括 posix 消息队列和 System V 消息队列;
- 共享内存:多个进程访问一块内存;
- 信号量:进程间同步;
- 套接字:不同机器间的进程通信。
下面是对它们的详解:
(1)管道 (pipe) 和命名管道 (named pipe) :管道可用于具有亲缘关系的进程间的通信;命名管道除具有管道所具有的功能外,还允许无亲缘关系进程间的通信。
(2)信号 (signal) :信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生。一个进程收到一个信号,与处理器收到一个中断请求的效果可以说是一样的。
(3)消息队列 (message queue) :消息队列是消息的链接表,包括 Posix 消息队列和 System V 消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息,对消息队列有读权限的进程则可以从消息队列中读取消息。
(4)共享内存 (shared memory) :共享内存可以说是最有用的进程间通信方式,是最快的可用 IPC 形式。它是针对其他通信机制运行效率较低而设计的。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
(5)信号量 (semaphore) :主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。
(6)套接字 (socket) :这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,其应用非常广泛。
嵌入式Linux系统编程学习之十八进程间通信(IPC)简介相关推荐
- 嵌入式Linux系统编程学习之十二守护进程
文章目录 前言 一.守护进程的特性 二.daemon 进程的编程规则 1.创建子进程,父进程退出 2.在子进程中创建新会话 前言 daemon 运行在后台,也称作"后台服务进程" ...
- 嵌入式Linux系统编程学习之三十四 Socket 编程
文章目录 一.使用 TCP 的流程图 1.1 头文件包含 1.2 socket 函数 1.3 bind 函数 1.4 listen 函数 1.5 accept 函数 1.6 recv 函数 1.7 s ...
- 嵌入式Linux系统编程学习之三十线程的同步
文章目录 一.条件变量 1.创建和注销 2.等待和激发 3.其他 二.信号灯 1.创建和注销 2.点灯和灭灯 3.获取灯值 4.其他 一.条件变量 条件变量是利用线程间共享的全局变量进行同步的一种 ...
- 嵌入式Linux系统编程学习之十五sigaction信号处理机制
文章目录 一.信号处理情况分析 二.sigaction 信号处理注册 三.sigprocmask 信号阻塞 一.信号处理情况分析 在 signal 处理机制下,还有许多特殊情况需要考虑: 注册一个 ...
- 嵌入式Linux系统编程学习之十四signal信号处理机制
可以用函数 signal 注册一个信号处理函数,原型为: #include <signal.h>typedef void(*sighandler_t)(int); //函数指针 voi ...
- 嵌入式Linux系统编程学习之十九标准管道流
像文件操作有标准 IO 流一样,管道也支持文件流模式.用来创建连接到另一进程的管道 popen 和 pclose . 函数原型: #include <stdio.h>FILE * ...
- 嵌入式Linux系统编程学习之十六用程序发送信号
文章目录 一.kill 和 raise 信号发送函数 二.sigqueue 信号发送函数 一.kill 和 raise 信号发送函数 kill 和 raise 信号的发送函数的原型分别为: #in ...
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- 嵌入式Linux系统编程学习之一目录结构
嵌入式Linux系统编程学习之一目录结构 文章目录 嵌入式Linux系统编程学习之一目录结构 前言 一.Linux目录结构 前言 Linux目录结构 一.Linux目录结构 /bin:存放Linux的 ...
最新文章
- 线性代数:05 实对称矩阵与二次型
- 研究一下,如何实现一个文件系统
- 关于CSS 3 及浏览器兼容性问题
- LeetCode Construct Binary Tree from Inorder and Postorder Traversal
- [PHP]Maximum execution time of 30 seconds exceeded
- Mybatis实现分库分表
- AntiSamy测试
- GraphQL 到底有什么魔力?
- Windows Workflow Foundation(WWF)介绍
- xml文件中““符号报错,无法识别
- 手把手教你编写一个简单的PHP模块形态的后门
- tensorflow下手写汉字识别及其可视化
- 人间繁华江上明月,乃浮生一梦,惟真情长在——读沈君山《浮生再记》(并转书评)...
- 服务器 关闭系统默认共享,默认共享还是有用滴!
- 蓝桥杯(纯C)比赛--菜鸟级
- ios logo 启动页大小
- 计算机程序中的自省程序(反射程序)(introspective program)是什么?(introspectable、introspection)
- 专线与家庭宽带的区别?
- python-11:lambda 函数
- 高通平台 android 12 定时开关机
热门文章
- python matplotlib使用ax绘图
- 进栈顺序为abcd则出栈顺序为_进栈顺序为a、b、c、d,则出栈顺序可以为?
- vue中使用百度地图,悬浮窗搜索功能
- C#图解教程 第十八章 枚举器和迭代器
- 版本控制工具--svn和git的使用(一) -----版本控制的好处以及分类
- 监听浏览器返回上一页
- 自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22——会持续更新...
- Mac下安装MySQL
- DataTemplate和ControlTemplate的关系
- 存储过程之游标笔记小结