当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]linux下的进程通信

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:

其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括:

Posix消息队列、Posix信号灯、Posix共享内存区。有两点需要简单说明一下:

1)由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算?肪车目梢浦残圆僮飨低辰缑妫≒SOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准;

2)BSD并不是没有涉足单机内的进程间通信(socket本身就可以用于单机内的进程间通信)。事实上,很多Unix版本的单机IPC留有BSD的痕迹,如4.4BSD支持的匿名内存映射、4.3+BSD对可靠信号语义的实现等等。

linux下进程间通信的几种主要手段简介:


1.管道

管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者可用于具有亲缘关系进程间的通信,即可用于父进程和子进程间的通信,后者额克服了管道没有名字的限制,因此,除具有前者所具有的功能外,它还允许无亲缘关系进程间的通信,即可用于运行于同一台机器上的任意两个进程间的通信。

无名管道由pipe()函数创建:

#include <unistd.h>

int pipe(int filedis[2]);

参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入。

在Linux系统下,有名管道可由两种方式创建:命令行方式mknod系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo的有名管道:

方式一:mkfifo("myfifo","rw");

方式二:mknod myfifo p

生成了有名管道后,就可以使用一般的文件I/O函数如open、close、read、write等来对它进行操作。


2.消息队列

消息队列是消息的链接表,包括Posix消息队列system

V消息队列。消息队列用于运行于同一台机器上的进程间通信,它和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

我们可以用流管道或者套接口的方式来取代它。


3.共享内存

共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。共享内存往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

首先要用的函数是shmget,它获得一个共享存储标识符。

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key, int size, int flag);

这个函数有点类似大家熟悉的malloc函数,系统按照请求分配size大小的内存用作共享内存。Linux系统内核中每个IPC结构都有的一个非负整数的标识符,这样对一个消息队列发送消息时只要引用标识符就可以了。这个标识符是内核由IPC结构的关键字得到的,这个关键字,就是上面第一个函数的key。数据类型key_t是在头文件sys/types.h中定义的,它是一个长整形的数据。在我们后面的章节中,还会碰到这个关键字。

当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。

void *shmat(int shmid, void *addr, int flag);

shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地址,进程可以对此进程进行读写操作。

使用共享存储来实现进程间通信的注意点是对数据存取的同步,必须确保当一个进程去读取数据时,它所想要的数据已经写好了。通常,信号量被要来实现对共享存储数据存取的同步,另外,可以通过使用shmctl函数设置共享存储内存的某些标志位如SHM_LOCK、SHM_UNLOCK等来实现。

[!--empirenews.page--]
4。信号量

信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:

(1) 测试控制该资源的信号量。

(2) 若此信号量的值为正,则允许进行使用该资源。进程将进号量减1。

(3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。

(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。

维护信号量状态的是Linux内核操作系统而不是用户进程。我们可以从头文件/usr/src/linux/include/linux/sem.h中看到内核用来维护信号量状态的各个结构的定义。信号量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是semget,用以获得一个信号量ID。

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget(key_t key, int nsems, int flag);

key是前面讲过的IPC结构的关键字,它将来决定是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。

semctl函数用来对信号量进行操作。

int semctl(int semid, int semnum, int cmd, union semun arg);

不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。

semop函数自动执行信号量集合上的操作数组。

int semop(int semid, struct sembuf semoparray[], size_t nops);

semoparray是一个指针,它指向一个信号量操作数组。nops规定该数组中操作的数量。

下面,我们看一个具体的例子,它创建一个特定的IPC结构的关键字和一个信号量,建立此信号量的索引,修改索引指向的信号量的值,最后我们清除信号量。


5.套接口

套接口(socket)编程是实现Linux系统和其他大多数操作系统中进程间通信的主要方式之一。我们熟知的WWW服务、FTP服务、TELNET服务等都是基于套接口编程来实现的。除了在异地的计算机进程间以外,套接口同样适用于本地同一台计算机内部的进程通信

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

苏州2022年10月19日 /美通社/ -- 2022年10月18日,全球光学及光电技术领军者蔡司在苏州工业园区奠基启动"凤栖"工程建设,这是蔡司在国内首次购地自建项目,标志着蔡司在中国本土化进程的进...

关键字: 光学 显微镜 进程 中国制造

蔡司在苏州工业园区奠基启动"凤栖"工程建设,这是蔡司在国内首次购地自建项目,标志着蔡司在中国本土化进程的进一步深化与扩展。 "凤栖"工程建成后,蔡司苏州将成为蔡司在中国更高规格的研发与制造的重要据点,为其工业质量、研究显...

关键字: 显微镜 进程

广东佛山2022年10月19日 /美通社/ -- 空间是人居生活的基础单元,承载着生存与活动的最基本功能。而对于理想空间的解构意义却在物理性容器之外,体现出人们对于空间和生活深层关系的思考,同时也塑造着人与空间的新型连接...

关键字: 温度 BSP 智能化 进程

互联网内容的主要介质在过去的几十年中完成了从文字到图片再到视频的转变。在不断变化中,一以贯之的是人们对体验更好,更真实、更丰富网络生活的追求。如今,视频和游戏内容都在向着更高刷新率与分辨率的方向发展,终端设备也在积极普及...

关键字: 元宇宙 Wi-Fi 7 通信

此前,印度政府曾在推特上公布“国家宽带使命”计划,并表示将于今年10月1日在印度正式推出5G服务,引发了不少网友的关注。然而,近日CNMO了解到,此条推文现已被删除。业内人士表示,印度可能尚未准备好从10月1日开始推出5...

关键字: 印度 5G 通信

助力再生农业转型、温室气体减排并改善农民生计  北京2022年10月13日 /美通社/ -- 雀巢咖啡作为雀巢集团最大且广受全球消费者喜爱的咖啡品牌,近期推出了使咖啡种植更加可持续的延展计划:雀巢咖啡2030...

关键字: 可持续发展 BSP 路线图 进程

(全球TMT2022年10月12日讯)Exyte已完成对美国废气净化技术专家Airgard Inc.的收购。Airgard成立于1988年,总部位于加利福尼亚州的Milpitas,是 "湿式" 洗涤器开发和制造领域的领...

关键字: TE AIR 进程 半导体行业

北京2022年10月8日 /美通社/ -- 日前,全球领先的IT基础设施提供商浪潮信息加入龙蜥社区并成为理事单位,致力于携手社区生态伙伴,共同推动开源操作系统的全产业链协同创新和产业化应用。 龙蜥社区成立于2020...

关键字: 开源 操作系统 通信 大数据

(全球TMT2022年10月8日讯)IT基础设施提供商浪潮信息加入龙蜥社区并成为理事单位,致力于携手社区生态伙伴,共同推动开源操作系统的全产业链协同创新和产业化应用。 龙蜥社区成立于2020年9月,是国内...

关键字: 操作系统 开源 通信 装机量

(全球TMT2022年9月30日讯)Tata Communications在印度浦那推出了专用私有5G"全球卓越中心"(CoE),为企业加速"工业4.0"应用和能力。这家新的CoE是一个敏捷、安全的室内设施,用来测试和...

关键字: 通信 5G COMMUNICATIONS 图像分析

嵌入式教程

6897 篇文章

关注

发布文章

编辑精选

技术子站

关闭