Linux系统编程 | 进程间通信概述

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方式,而且,它不仅可以使用在本机,还可以在不同的机器的进程间实现通信。

---------------

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良许Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值