进程间通信方式介绍

1、进程通信的提出       

进程的数据空间是相互独立的,所以进程间的数据是不能相互可访问的。在某些开发场景下,进程间是需要进行数据通信的,数据通信的场景有以下几种:

(1)数据传输:一个进程需要将数据发送给另一个进程。

(2)共享数据:多个进程共享感兴趣的数据,一个进程对共享数据进行修改,其他进程应该能立即访问到修改的数据。

(3)通知事件:一个进程需要向另一个或者一组进程发送消息,通知它们发生了某种事件。

(4)进程控制:一个进程希望控制另一个进程的运行。

2、进程通信方式

进程间的通信方式有以下7种

(1)管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间进行使用(具有亲缘关系的进程通常是指父子进程)。可以把管道看作一种特殊的文件,管道的读写可以使用普通的read、write等函数,但它不是普通的文件,不属于任何文件系统,且只存在于内存中。

常用fork函数创建子进程,fork函数的用法可参考 :Linux系统——fork()函数详解(看这一篇就够了!!!)_fork函数_代码拌饭饭更香的博客-CSDN博客

(2)命名管道(named pipe):命名管道也是半双工通信方式,但是它允许无亲缘关系的进程间进行通信。

(3)信号(signal):信号用于通知其他进程有某种事情发生。信号是进程通信机制中唯一的异步通信机制,可以在任何时候发送信号给某个进程。信号不同于信号量,信号事件主要来源有硬件来源和软件来源,硬件来源 如常见的组合键Ctrl+C产生的SIGINIT信号,表示退出该进程。软件来源 如kill -9 pidId,通过该命令来立即停止该进程。

(4)消息队列(message):消息队列是一种可靠的进程间通信方式,是存放在内核中并由消息队列标识符标识。进程可以向队列中添加消息,其他的进程可以读取到队列中的消息。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓存区大小受限等缺点。

(5)信号量(semaphore):信号量也叫信号灯,是一个计数器。信号量通过锁机制,可用于控制多个进程对共享内存的访问。信号量也用于线程间数据的同步。

(6)共享内存(shared memory):共享内存就是映射一段能被其他进程访问的一块内存,该块内存由一个进程创建,多个进程访问。共享内存是进程间通信最快的进程通信方式。共享内存常跟信号量配合,来实现进程间的数据同步。

(7)套接字(socket):套接字与其他通信机制最大的不同就是可用于不同设备间、不同系统间的进程通信。

目前推荐使用进程间的通信方式是共享内存和套接字的通信方式。

附加:

进程的其他介绍可参考:

Linux进程间通信详解(最全) - 知乎 (zhihu.com)

面试官:说说进程间通信和线程间通信的几种方式及区别 - 知乎 (zhihu.com)

C++进程间通信的多种方式及实现_c++ 跨进程通信_笙语丶亦凉的博客-CSDN博客

你可能感兴趣的:(C/C++语言,linux,服务器,网络)