搜索
bottom↓
回复: 0

《I.MX6U嵌入式Linux C应用编程指南》第十一章 进程间通信简介

[复制链接]

出0入234汤圆

发表于 2021-8-17 18:25:27 | 显示全部楼层 |阅读模式
1)实验平台:正点原子i.MX6ULL Linux阿尔法开发板
2)  章节摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南
3)购买链接:https://item.taobao.com/item.htm?&id=603672744434
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子Linux技术交流群:1027879335
1.png

2.jpg


3.png

第十一章 进程间通信简介

       前面学习了进程相关的内容,介绍了如何通过fork()或vfork()创建子进程,以及在子进程中通过exec()函数执行一个新的程序。本章向大家介绍一个新的内容---进程间通信。
       所谓进程间通信指的是系统中两个进程之间的通信,不同的进程都在各自的地址空间中、相互独立、隔离,所以它们是处在于不同的地址空间中,因此相互通信比较难,Linux内核提供了多种进程间通信的机制。本章就来聊一聊这些进程间通信的手段,让大家对此有一个基本的认识!

1.1进程间通信简介
       进程间通信(interprocess communication,简称IPC)指两个进程之间的通信。系统中的每一个进程都有各自的地址空间,并且相互独立、隔离,每个进程都处于自己的地址空间中。所以同一个进程的不同模块(譬如不同的函数)之间进行通信都是很简单的,譬如使用全局变量等。
       但是,两个不同的进程之间要进行通信通常是比较难的,因为这两个进程处于不同的地址空间中;通常情况下,大部分的程序是不要考虑进程间通信的,因为大家所接触绝大部分程序都是单进程程序(可以有多个线程),对于一些复杂、大型的应用程序,则会根据实际需要将其设计成多进程程序,譬如GUI、服务区应用程序等。
       在一些中小型应用程序中通常不会将应用程序设计成多进程程序,自然而然便不需要考虑进程间通信的问题,所以,本章内容以了解为主、了解进程间通信以及内核提供的进程间通信机制,并不详解介绍进程间通信,如果大家在今后的工作当中参与开发的应用程序是一个多进程程序、需要考虑进程间通信的问题,此时再去深入学习这方面的知识!
1.2进程间通信的机制有哪些?
       Linux内核提供了多种IPC机制,基本是从UNIX系统继承而来,而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接字(Socket,也就是网络)的进程间通信机制。Linux则把两者继承了下来,如下如所示:
第十一章 进程间通信简介921.png

图 11.2.1 Linux锁继承的进程间通信手段

       其中,早期的UNIX IPC包括:管道、FIFO、信号;System V IPC包括:System V信号量、System V消息队列、System V共享内存;上图中还出现了POSIX IPC,事实上,较早的System V IPC存在着一些不足之处,而POSIX IPC则是在System V IPC的基础上进行改进所形成的,弥补了System V IPC的一些不足之处。POSIX IPC包括:POSIX信号量、POSIX消息队列、POSIX共享内存。
总结如下:
UNIX IPC:管道、FIFO、信号;
System V IPC:信号量、消息队列、共享内存;
POSIX IPC:信号量、消息队列、共享内存;
Socket IPC:基于Socket进程间通信。
1.3管道和FIFO
       管道是UNIX系统上最古老的IPC方法,它在20世纪70年代早期UNIX的第三个版本上就出现了。把一个进程连接到另一个进程的数据流称为管道,管道被抽象成一个文件,5.1小节曾提及过管道文件(pipe)这样一种文件类型。
管道包括三种:
普通管道pipe:通常有两种限制,一是单工,数据只能单向传输;二是只能在父子或者兄弟进程间使用;
流管道s_pipe:去除了普通管道的第一种限制,为半双工,可以双向传输;只能在父子或兄弟进程间使用;
有名管道name_pipe(FIFO):去除了普通管道的第二种限制,并且允许在不相关(不是父子或兄弟关系)的进程间进行通讯。
普通管道可用于具有亲缘关系的进程间通信,并且数据只能单向传输,如果要实现双向传输,则必须要使用两个管道;而流管道去除了普通管道的第一种限制,可以半双工的方式实现双向传输,但也只能在具有亲缘关系的进程间通信;而有名管道(FIFO)则同时突破了普通管道的两种限制,即可实现双向传输、又能在非亲缘关系的进程间通信。
1.4信号
       关于信号相关的内容在本书第八章中给大家介绍过,用于通知接收信号的进程有某种事件发生,所以可用于进程间通信;除了用于进程间通信之外,进程还可以发送信号给进程本身。
1.5消息队列
       消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括POSIX消息队列和System V消息队列。
       消息队列是UNIX下不同进程之间实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
1.6信号量
       信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问,相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志,除了用于共享资源的访问控制外,还可用于进程同步。
       它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源,因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。Linux提供了一组精心设计的信号量接口来对信号量进行操作,它们声明在头文件sys/sem.h中。
1.7共享内存
       共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程都可以访问,使得多个进程可以访问同一块内存空间。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的,它往往与其它通信机制,譬如结合信号量来使用,以实现进程间的同步和通信。
1.8套接字(Socket)
       Socket是一种IPC方法,是基于网络的IPC方法,允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据,说白了就是网络通信,在提高篇章节内容中将会向大家介绍Linux系统下的网络编程。
在一个典型的客户端/服务器场景中,应用程序使用socket进行通信的方式如下:
各个应用程序创建一个socket。socket是一个允许通信的“设备”,两个应用程序都需要用到它。
服务器将自己的socket绑定到一个众所周知的地址(名称)上使得客户端能够定位到它的位置。

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 09:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表