APP下载

Linux下进程间通信机制的探讨许豪

2016-03-15陈可

科技与创新 2016年3期
关键词:信号

陈可

摘 要:简单介绍了Linux下的进程间通信机制,包括信号、管道、信号量、共享内存、消息队列,重点分析了信号和管道通信机制,包括信号通信机制的本质、信号通信机制在代码中的实现、利用信号传递数据的具体方法。此外,还总结了管道通信机制、信号量通信机制、消息队列通信机制、共享内存通信机制的特点、实现过程及其在编程过程中应重点关注的问题。

关键词:进程间通信;信号;信号量;通信机制

中图分类号:TP316.81 文献标识码:A DOI:10.15913/j.cnki.kjycx.2016.03.083

本文主要介绍了Linux下进程间通信机制的发展历史、分类以及每一种进程间通信机制的特点、适用场景等。从单个操作系统的内部看,Linux下的进程间通信机制有信号、管道、信号量、共享内存、消息队列。在以上进程间通信机制中,信号和管道是最古老的进程间通信机制。这两种进程间通信机制是Linux操作系统直接从UNIX操作系统继承过来的。

1 信号通信机制

信号通信机制比较特殊,类似于异步软中断。如果两个进程利用信号通信,则必须具备1个信号发送进程和1个信号接收进程。

可以调用kill函数和sigqueue函数完成信号的发送,并可在2个函数中分别指定信号发送至哪个进程、被发送信号的值。如果需要随信号发送一些附加信息给信号接收程序,则只能采用sigqueue函数完成该操作。此时,会将附加信息存储在sigqueue函数的第三个参数中,该参数中的信息会随着信号一起发送至信号接收进程。

接收信号进程需要调用signal函数或sigaction函数来安装信号,即规定当前进程接收到信号后去完成怎样的任务。通常情况下,这些任务会封装在1个函数中。如果接收进程通过signal函数安装信号,则接收进程无法接收随着信号传递而来的附加信息。如果需要接收随着信号传递而来的附加信息,则需要调用sigaction函数完成信号的安装。接收信号进程一旦接收到信号后,就会调用与该信号相关的函数,并执行该函数内部的代码;函数代码执行完毕后,当前进程返回到原程序继续执行。该过程类似于当前进程陷入到一次中断,中断完毕后又恢复执行的过程。

2 管道通信机制

管道通信机制又分为有名管道和匿名管道(无名管道)。有名管道相当于文件系统的文件之一,有正式的文件名称,可通过ls命令在文件系统中查看该文件。当两个进程利用有名管道通信时,可先利用mkfifo函数创建1个有名管道文件,然后在读、写进程中分别打开该文件进行读、写操作即可。该过程类似于操作普通文件。匿名管道通信机制没有有名管道通信机制灵活,其仅适用于具有血缘关系的进程间通信,即父子进程、兄弟进程。匿名管道类似于当前进程的资源之一,当前进程结束后,匿名管道会随之消亡。如果父子进程利用匿名管道通信,则父进程必须在调用fork函数创建子进程前,先调用pipe函数创建匿名管道。此时,子进程才能从父进程继承同一个匿名管道的相关信息。其中,最重要的部分是匿名管道的读、写端口,其文件描述符在pipe函数调用成功后就已生成。读进程只能通过读端口文件描述符从管道文件中读取数据,写端口只能通过写端口文件描述符向管道文件中写入数据。如果操作错误,则程序会出错并返回。

除了管道和信号外,还有信号量、消息队列和共享内存三种System V进程间通信机制。从代码层面看,这些进程间通信机制有很多类似之处,但从实现的层面看,三者是有区别的。

3 消息队列通信机制

消息队列通信机制一般用于信息量较小的进程间通信。消息队列通信机制是通过在内存中创建1个队列来让2个进程完成通信的。发送消息的进程会先调用msgget函数创建1个消息队列,然后通过msgsnd函数将消息发送到消息队列中;接收消息的进程会先调用同样的函数msgget,但此时msgget函数表示打开现有的消息队列,接收进程中的msgget函数参数必须与发送进程中的msgget函数参数一致,接收进程打开消息队列后,会直接调用msgrcv函数,从而从消息队列中获取消息。

4 共享内存通信机制

当多个进程需要共享、传递大量数据时,往往会采用共享内存通信机制。共享内存是进程间通信机制中效率最高的一种。写进程时,只需要调用shmget函数创建共享内存,再调用shmat函数将创建的共享内存映射到自身的逻辑地址空间后,相关人员就可直接操作这块内存区域;读进程时,其代码与写进程代码类似,但读进程中shmget函数的参数必须与写进程中shmget函数中的参数一致。读、写进程利用共享内存通信完毕后,需要分别调用shmdt函数,以解除共享内存和各自逻辑地址空间的映射关系。

5 信号量通信机制

信号量通信机制比较特殊,因为进程不能通过信号量传递数据,信号量仅能表示当前与该信号量相关资源的数量。通过控制信号量,能控制多个进程的资源共享过程。创建信号量集合可用semget函数,从而可确定信号量集合中信号量的个数;通过semop函数可对信号量进行增加或减少操作,并通过semctl函数可完成对信号量值及其他属性的操作。

6 结束语

综上所述,Linux操作系统中的5种进程间通信机制各有特点,在代码实现的过程中,需要具体问题具体分析。只有这样,才能提高Linux下进程间通信的效率。

参考文献

[1]杨宗德.Linux高级程序设计[M].北京:人民邮电出版社,2012.

[2]杨水清.精通ARM嵌入式Linux系统开发[M].北京:电子工业出版社,2012.

〔编辑:张思楠〕

猜你喜欢

信号
肩背痛竟然也是肺癌信号
完形填空二则
大赤鱿的图案信号
等待信号员
民用航空测距信号对北斗导航信号的干扰分析
民用航空测距信号对北斗导航信号的干扰分析
信号
美国信号9防卫公司Reliant四管手枪
高处信号强
播出系统信号源自动切换方案