[Linux]进程间通信的方式及实现系列1

我们知道通过fork()或是vfork()创建子进程,以及在子进程中通过exe()函数执行一个新的程序。
进程间通信指的是系统中两个进程之间的通信。不同的进程都在各自的地址空间中,互相独立,隔离。所以他们是处在不同的地址空间中,因此相互通信比较难。好在,Linux内核提供了多种进程间通信的机制。

总述

Linux内核提供了多种IPC机制,基本是从UNIX系统继承而来的,而对UNIX发展做出重大贡献的是AT&T的贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。如下图所示,

在这里插入图片描述
总结如下,

  • 早起 UNIX IPC:管道,FIFO,信号
  • system V IPC -> POSIX IPC: 信号量,消息队列,共享内存
  • Socket IPC:基于Socket进程通信

进程间通信的模型

管道模型

这个是我们做事情的最传统的方式。类似于软件开发的瀑布模型。把第一个任务做完后所得的输出,作为第二个任务的输入经过处理后得到输出,在作为第三个任务的输入。。。以次类推。任务之间有明确的先行后续的逻辑顺序关系,没有重合。后一个任务依赖于前一个任务的结果。
管道 是命令行中常用的工具。分为下面 匿名管道和命名管道两种。

匿名管道

ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9

这里面的竖线“|”,就是一个管道。他会将前一个命令的输出,作为后一个命令的输入。这类管道没有名字,用完就销毁了。管道随着命令的执行自动创建,自动销毁。
管道是一种单向传输数据地机制,他其实就是一段缓存。里面的数据只能从一端写入,从另一端读出。如果想双向通信的话,我们需要创建两个管道。

命名管道

mkfifo myPipe
echo "hello world" > myPipe

命名管道,管道需要通过mkfifo命令显示地创建。myPipe就是这个管道的名称。管道以文件的形式存在,这个也符合Linux 一切皆文件的原则。

如上,我们可以向命名管道里面写东西,当然也可以读东西。

cat < myPipe

此时,在myPipe写入的消息就会被读出。

消息队列模型

消息队列包括 POSIX消息队列和 System V 消息队列。

消息队列是消息的链表,存放在内核中并由消息队列表识符标识。消息队列克服了 信号传递消息少,管道只能承载无格式字节流以及缓存区大小受限等缺陷。

消息队列是Linux下不同进程之间实现共享资源的一种机制。Linux允许不同进程将格式化的数据流以消息队列的形式发送给任意进程。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

共享内存

共享内存就是映射一段能被其他进程所访问的内存。这段共享内存由一个进程所创建,但其他的多个进程都可以访问。使得多个进程可以访问同一块内存空间。

共享内存是最快的IPC方式,他是针对其他进程间通信方式运行效率低而专门设计的。他往往与其他的通信机制,比如结合信号量来使用,以实现进程间的同步和通信。

信号量模型

信号量是一个计数器。与其他进程间通信方式不大相同。他主要用于控制多个进程间 或 一个进程内的多个线程间对共享资源的访问。相当于内存中的标志。进程可以根据他判定是否能够访问默写共享资源。同时,进程也可以修改该标志。除用于共享资源的访问控制外,还可以用于进程同步。

他常作为一种锁机制,防止某进程在访问资源时其他进程也访问该资源。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。Linux提供了一组精心设计的信号量接口来对信号量进行操作,这些操作被声明在头文件 sys/sem.h中。

信号机制模型

用于通知进程 接收有某种事件发生的信号。除了用于进程间通信外,进程还可以发送信号给进程本身。

socket通信机制模型

Socket是一种IPC方法,是基于网络的IPC方法。他允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。其实就是网络通信。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值