Linux环境编制之IPC进程间通信(一):IPC概述

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。

IPC是进程间通信的简称,它是运行在某个操作系统上的不同进程间各种消息传递的方式。IPC的方式有如下几种:管道、FIFO(也成有名管道)、消息队列、套接字、远程过程调用(RPC)。其中管道只能在具有共同祖先(指父子进程关系)的进程间使用,但FIFO(有名管道)解决了该问题;消息队列可用在同一主机上有亲缘关系和无亲缘关系的进程间之间;远程过程调用是一个系统(客户主机)上某个程序调用另一个系统(服务器主机)上某个函数的一种方法,是作为显示网络编程的一种替换方法开发的,既然客户和服务器之间通常传递一些信息(被调用函数的参数与返回值),而RPC可用在同一主机上的客户和服务器之间,因此可认为RPC是另一种形式的消息传递。

图 进程间共享信息的三种方式

左边的两个进程共享存留于文件系统中某个文件上某些信息;中间的两个进程共享驻留于内核中的某些信息;右边的两个进程有一个双方都能访问的共享内存区。图中虽然只画了两个进程,但实现中可以是任意数目的进程。一个给定进程内的所有线程共享同样的全局变量(也就是说共享内存区的概念对线程来说是内在的)。然而我们必须关注的是各个线程间对全局数据的同步访问。因此,可以不把同步当作一种IPC形式,而是伴随许多IPC形式使用的,以控制对某些共享数据的访问。

由上面的三种共享信息的三种方式可以看出IPC的三种持续性,即一个IPC对象一直存在多长时间。

图 IPC对象的持续性


IPC类型


持续性


管道

FIFO


随进程

随进程


Posix读写锁

Posix互斥锁

Posix条件变量

fcntl记录上锁


随进程

随进程

随进程

随进程


Posix消息队列

Posix有名信号量

Posix基于内存的信号量

Posix共享内存区


随内核

随内核

随进程

随内核


System V消息队列

System V信号量

System共享内存区


随内核

随内核

随内核


TCP套接字

UDP套接字

Unix域套接字


随进程

随进程

随进程

图 各种类型IPC对象的持续性

上图中没有任何类型的IPC具备随文件系统的持续性,Posix IPC的三种类型可能具有该持续性,但取决于实现。其实,向一个文件写入数据提供了随文件系统的持续性,但这不作为一种IPC形式使用。多数形式的IPC并没有在系统重新自举后继续存在的必要,因为进程在自举后就不会存在了。而且,对于一种给定形式的IPC,要求具备随文件系统的持续性可能会使其性能降级,而IPC的一个基本的设计目标时高性能。

参考:

Linux环境编制之IPC进程间通信(一):IPC概述,布布扣,bubuko.com

时间: 2024-08-25 10:06:08

Linux环境编制之IPC进程间通信(一):IPC概述的相关文章

Linux环境编程之IPC进程间通信(五):Posix消息队列1

对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的.而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每个消息都是一个记录,它由发送者赋予一个优先级.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后的某个时刻读出这些消息.这跟管道和FIFO不一样,当一个管道或FIFO的最后一次关闭时

Linux环境编程之IPC进程间通信(三):FIFO

管道是没有名字的,因此它只能在有亲缘关系的进程间使用,给管道加上名字,我们称之为有名管道FIFO,当然FIFO与管道之间不止有没有名字的区别,还有其他区别下面会提到.与管道类似的是,FIFO是一个单向(半双工)数据流.不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程之间访问同一个FIFO.FIFO是一种文件类型.stat结构成员st_mode的编码指明文件是否是FIFO类型,可以用S_ISFIFO宏对此进行测试. FIFO由mkfifo函数创建,它已经隐含指定了O_CR

Linux环境编程之IPC进程间通信(四):管道和FIFO比较

系统加于管道和FIFO的唯一限制是: 1.OPEN_MAX 一个进程在任意时刻打开的最大描述符数.可以通过调用sysconf函数查询. 2.PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量.Posix任务它是一个路径名变量,它的值可以随指定的路径名而变化,因为不同的路径名可以落在不同文件系统上,而这些文件系统可能有不同的特征.所以PIPE_BUF可通过pathconf函数取得. pipeconf.c #include <stdio.h> #include <stdlib.h&

Linux环境编程之IPC进程间通信(二):管道

管道作为最古老的进程间通信方法,它有以下几个特点: 1.在所有的UNIX实现中都存在. 2.没有名字,因此只能由有亲缘关系的进程使用. 3.它由函数pipe创建,read和write函数访问,但只提供单路(单向)数据流. <span style="font-size:14px;">#include <unistd.h> int pipe(int fd[2]); 返回:若成功则为0,若出错则为-1</span> 经由参数fd返回两个文件描述符:fd[0

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC) 郑彦兴 原文地址:http://www.ibm.com/developerworks/cn/linux/l-ipc/index.html 一个大型的应用系统,往往需要众多进程协作,进程(Linux进程概念见附1)间通信的重要性显而易见.本系列文章阐述了Linux环境下的几种主要进程间通信手段,并针对每个通信手段关键技术环节给出详细实例.为达到阐明问题的目的,本文还对某些通信手段的内部实现机制进行了分析. 序 linux下的进程通信手段基本上是从Unix平台

Unix/Linux进程间通信(IPC) -- 概述

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

Linux进程间通信(IPC)

一.进程间通信概述 进程通信有例如以下一些目的: A.传输数据:一个进程须要将它的数据发送给还有一个进程.发送的数据量在一个字节到几M字节之间 B.共享数据:多个进程想要操作共享数据.一个进程对共享数据的改动,别的进程应该立马看到. C.通知事件:一个进程须要向还有一个或一组进程发送消息.通知它(它们)发生了某种事件(如进程终止时要通知父进程). D.资源共享:多个进程之间共享相同的资源.为了作到这一点,须要内核提供锁和同步机制. E.进程控制:有些进程希望全然控制还有一个进程的运行(如Debu

解Linux进程间通信(IPC)方式

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

理解Linux进程间通信(IPC)

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