学习
实践
活动
专区
工具
TVP
写文章

进程间通信概述

第一时间关注Linux技术干货!

本文字数:1290字

阅读时间:4分钟

作者

良许

一个热爱技术的程序猿

1. 进程间通信的概念

我们知道,在linux环境下,进程与进程之间是相互独立的,每个进程各自都有不同的用户地址空间。一般而言,进程间的进程空间是不能相互访问的。

但在很多情况下,进程与进程之间是需要进程相互通信的,一起来完成某项特定的功能需求。在linux环境下,进程间通信(Inter Process Communication,IPC)是通过内核来完成的。

2. 进程间通信的应用场景

数据传输:一个进程需要将它的一个或多个字节的数据发送给另一个进程;

共享数据:多个进程共享内存某个数据,任意一个进程修改了共享数据,其它进程相应的会得到更改后的数据;

通知事件:一个进程需要向另一个或一组进程发送消息,通知它(们)发生了某种事件(如一个进程向另一个进程发送“终止进程”的信号,对应的进程立即中止)。

资源共享:多个进程之间共享同一个资源。通常情况下,为了实现此功能,需要使用到内核所提供锁和同步机制。

进程控制:某个进程希望完全控制另一个进程的执行,例如,Debug进程。此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

3. 进程间通信的方式

3.1 管道

管道又分为两种:管道(pipe)及有名管道(named pipe)。而管道又称为无名管道或匿名管道。

管道只能应用于具有血缘关系的进程之间的通信,比如父子进程;

有名管道突破了无名管道只能用于具有血缘关系的进程的限制,它不仅具有无名管道所有功能,还允许无血缘关系的进程间进行通信。

3.2 信号(signal)

信号用于向特定的进程通知有某种事件产生,那个进程根据之前的预设,执行一个具体的函数。信号的语义函数有signal及sigaction,前者比较简单,而后者功能更强大,也更安全。

3.3 信号量(semaphore)

信号量本质是一个计数器,一般将它当作锁机制,来控制多个进程对共享资源的访问。当多个进程,或者同一进程里的多个线程要对某个资源进行访问时,可使用信号量来实现同步。

3.4 消息队列(message queue)

消息队列其实就是一个消息的链表,具有写权限的进程可以往队列里写入消息,而具有读权限的进程可以从队列里读出消息。消息队列比较灵活,比信号承载的信息要多,同时克服了管道缓冲区受限及只能传输无格式字节流的缺点。

3.5 共享内存(shared memory)

这是一种最快的IPC方式,内核在内存里开辟了一块空间,多个进程可以进行访问。正是因为其它的IPC方式速度比较慢,所以才设计了这种通信方式。但为了实现进程间同步及互斥,还需要其它IPC方式,比如信号量,一起配合使用。

3.6 套接字(socket)

这是一种最稳定,最可靠的IPC方式,而且,它不仅可以使用在本机,还可以在不同的机器的进程间实现通信。

本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180712G1WQEL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券