欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

流程之间的沟通方式:

最编程 2024-03-01 12:57:36
...

一,定义

进程间通信(IPC,Inter-Process Communication)是指在不同进程间传播和交换信息。

二,进程间通信的几种方式

常见的进程间的通信方式为7种:

  • 1,管道(pipe)。又称无名管道,是最古老的进程间通信的方式。
  • 2,命名管道(FIFO)。
  • 3,消息队列(MessageQueue)。
  • 4,信号量(Semaphore)。
  • 5,共享内存(SharedMemory)。
  • 6,套接字Socket。
  • 7,信号(signal)。

按照通信类型划分:
1,共享存储系统

    1. 基于共享数据结构的通信方式。(仅适用于传递相对少量的数据,通信效率低,数据低级通信)。
    1. 基于共享存储区的通信方式。

2,管道通信系统。

3,消息传递系统。
4,客户机服务器系统。

三,进程间通信几种方式详解

1,管道(pipe)

把一个进程连接到另外一个进程的一个数据流成为管道,通常一个进程的输出作为另外一个进程的输入。本质是内核的一块缓存。Linux的管道主要有两种:无名管道和有名管道。

  • 1,无名管道
    无名管道是管道通信的一种原始的方法。主要特点是:
    (1),他只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
    (2),它是半双工的通信模式,具有固定的读端和写端。
    (3)管道可以看成是一个特殊的文件,可以使用普通的read、write函数。但是它不是普通的文件,存在于内存中并不属于其他的文件系统。
    详细的介绍及其实践
  • 2,命名管道(FIFO)
    有名管道是对无名管道的一个改进。其具有的特点是:
    (1),互不相关的程序之间也能实现彼此通信。
    (2),管道可以通过路径指出,在文件系统中是可见的。在建立管道后,进程之间把它当成普通的文件进行读(read)写(write)操作,和使用文件一样方便。
    (3),严格遵循FIFO(先进先出)规则。对管道的数据的读总是从开始处返回数据,结尾处添加数据,不知道文件定位符的操作,如lseek()。
    详细的介绍及其实践
2,消息队列(MessageQueue)

消息队列提供一个进程向另外一个进程发送数据块的一种方法。消息队列区别与像rabbitmq这样的消息队列的中间模块。

另外一中解释是消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。

基本特性:

  • 在某个进程往一个队列写入消息之前,并不需要另外一个进程在该队列上等待消息的到达。
  • 消息队列具有内核的持续性。一个进程可以往某个队列写入一些消息,然后终止,让另外一个进程在以后某个时刻读出这些消息。
  • 队列属性。
  • 消息队列可用双向通信。

插入知识点:
1,进程持续性:随进程持续的IPC:一直存在到打开IPC对象的最后一个进程关闭该对象为止。
2,内核持续性:随着内核持续的IPC:一直存在到内核重新自举或显式删除IPC为止。
3,文件系统持续性:随文件系统的持续的IPC:一直存在到显式删除IPC为止。

IPC类型 持续性
FIFO 随进程
Posix互斥锁 随进程
Posix条件变量 随进程
Posix读写锁 随进程
fcntl记录上锁 随进程
Posix消息队列 随内核
Posix有名信号量 随内核
Posix基于内存的信号量 随进程
Posix共享内存区 随内核
System V消息队列 随内核
System V信号量 随内核
System V共享存储区 随内核
TCP套接字 随进程
UDP套接字 随进程
Unix域套接字 随进程

消息队列使用例子详细介绍

3,信号量(Semaphore)

定义:信号量(Semaphore)用于实现进程之间的互斥与同步,而不是用于进程之间的数据通信。主要实现是基于操作系统的PV操作。

特点:
1,信号量用于进程间同步,若要在进程之间传递需要结合共享内存。
2,信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作。
3,每次对信号量的PV操作不仅限于对信号量的值加1或减1,而且可以加减任意正整数。
4,支持信号量组。
信号量函数介绍及其实践例子

4,共享内存(SharedMemory)

定义:共享内存允许两个或更多的进程访问同一块内存,就如同malloc()函数向不同进程返回了一个指向同一个物理内存的指针。

共享存储的介绍及其实践

5,套接字Socket

定义:套接字(socket)用于协调不同的进程间的通信,可以是不同计算机上的进程。
套接字通信方式很多,有Unix域套接字、TCP套接字、UDP套接字、链路层套接字等等。最常用的是TCP套接字。下面链接中一个详细的介绍
套接字的介绍

套接字的介绍及其实践

6,信号(signal)

概念:
1)信号是在软件层上对中断机制的一种模拟,是一种异步通信方式。
2)信号可以直接进行用户控件进程和内核进程之间的交互,内核进程也可以利用它通知用户空间进程发生了哪些系统事件。
3)如果该进程当前并未处于执行态,则该信号就由内核保护起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

信号介绍
信号的介绍及其实践

推荐阅读