首页 » 技术文章 » linux操作系统下的进程通信设计

linux操作系统下的进程通信设计

作者:  时间:2010-12-16 14:35  来源:EDN

  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标准;

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

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

  1.管道

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

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

  #include <unistd.h>

  int pipe(int filedis)

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

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

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

  方式二:mknod myfifo p

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

  2.消息队列

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

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

相关推荐

Linux将进军汽车智能系统领域

Linux  汽车智能系统  2013-07-09

Android回归Linux核心怀抱

Google  Linux  Android  2012-11-01

EXT4数据损失bug影响Linux稳定版内核

EXT4  Linux  2012-10-25

Fedora Linux 18 延期至年底

Fedora Linux 18  2012-10-17

Marvell和Tuxera推出业界最快的全功能NAS解决方案

Marvell  Linux  NAS  2012-01-19

ARM-Linux嵌入式系统的BootLoader分析与设计

嵌入式系统  Linux  2011-09-19
在线研讨会
焦点