专栏首页JAVA人生/面试技巧进程之间究竟有哪些通信⽅方式?如何通信? mkfifo - 创建FIFO(命名管道)

进程之间究竟有哪些通信⽅方式?如何通信? mkfifo - 创建FIFO(命名管道)

文章来自帅地玩编程 进程之间究竟有哪些通信⽅方式?如何通信? 1、管道 我们来看⼀一条 Linux 的语句句

netstat -tulnp | grep 8080

 学过 Linux 命名的估计都懂这条语句句的含义,其中”|“是管道的意思,它的作⽤用就是把前⼀一条命令的输出

作为后⼀一条命令的输⼊入。在这⾥里里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输⼊入。如 果两个进程要进⾏行行通信的话,就可以⽤用这种管道来进⾏行行通信了了,并且我们可以知道这条竖线是没有名字 的,所以我们把这种通信⽅方式称之为匿匿名管道。 并且这种通信⽅方式是单向的,只能把第⼀一个命令的输出作为第⼆二个命令的输⼊入,如果进程之间想要互相 通信的话,那么需要创建两个管道。 居然有匿匿名管道,那也意味着有命名管道,下⾯面我们来创建⼀一个命名管道。

mkfifo - 创建FIFO(命名管道)

makefifo test

这条命令创建了了⼀一个名字为 test 的命名管道。 接下来我们⽤用⼀一个进程向这个管道⾥里里⾯面写数据,然后有另外⼀一个进程把⾥里里⾯面的数据读出来。

echo "this is a pipe">test

这个时候管道的内容没有被读出的话,那么这个命令就会⼀一直停在这⾥里里,只有当另外⼀一个进程把 test ⾥里里

⾯面的内容读出来的时候这条命令才会结束。接下来我们⽤用另外⼀一个进程来读取

cat < test//读数据

我们可以看到,test ⾥里里⾯面的数据被读取出来了了。上⼀一条命令也执⾏行行结束了了。 从上⾯面的例例⼦子可以看出,管道的通知机制类似于缓存,就像⼀一个进程把数据放在某个缓存区域,然后等 着另外⼀一个进程去拿,并且是管道是单向传输的。 这种通信⽅方式有什什么缺点呢?显然,这种通信⽅方式效率低下,你看,a 进程给 b 进程传输数据,只能等 待 b 进程取了了数据之后 a 进程才能返回。 所以管道不不适合频繁通信的进程。当然,他也有它的优点,例例如⽐比较简单,能够保证我们的数据已经真 的被其他进程拿⾛走了了。我们平时⽤用 Linux 的时候,也算是经常⽤用。 2、消息队列列 那我们能不不能把进程的数据放在某个内存之后就⻢马上让进程返回呢?⽆无需等待其他进程来取就返回呢? 答是可以的,我们可以⽤用消息队列列的通信模式来解决这个问题,例例如 a 进程要给 b 进程发送消息,只需 要把消息放在对应的消息队列列⾥里里就⾏行行了了,b 进程需要的时候再去对应的 消息队列列⾥里里取出来。同理理,b 进 程要个 a 进程发送消息也是⼀一样。这种通信⽅方式也类似于缓存吧。 netstat -tulnp | grep 8080 mkfifo test echo "this is a pipe" > test // 写数据 cat < test // 读数据 这种通信⽅方式有缺点吗?答是有的,如果 a 进程发送的数据占的内存⽐比较⼤大,并且两个进程之间的通信 特别频繁的话,消息队列列模型就不不⼤大适合了了。因为 a 发送的数据很⼤大的话,意味发送消息(拷⻉贝)这个 过程需要花很多时间来读内存。 哪有没有什什么解决⽅方案呢?答是有的,请继续往下看。 3、共享内存 共享内存这个通信⽅方式就可以很好着解决拷⻉贝所消耗的时间了了。 这个可能有⼈人会问了了,每个进程不不是有⾃自⼰己的独⽴立内存吗?两个进程怎么就可以共享⼀一块内存了了? 我们都知道,系统加载⼀一个进程的时候,分配给进程的内存并不不是实际物理理内存,⽽而是虚拟内存空间。 那么我们可以让两个进程各⾃自拿出⼀一块虚拟地址空间来,然后映射到相同的物理理内存中,这样,两个进 程虽然有着独⽴立的虚拟内存空间,但有⼀一部分却是映射到相同的物理理内存,这就完成了了内存共享机制 了了。 4、信号量量 共享内存最⼤大的问题是什什么?没错,就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问 题。如何解决这个问题?这个时候我们的信号量量就上场了了。 信号量量的本质就是⼀一个计数器器,⽤用来实现进程之间的互斥与同步。例例如信号量量的初始值是 1,然后 a 进 程来访问内存1的时候,我们就把信号量量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量量 的值为 0 就知道已经有进程在访问内存1了了,这个时候进程 b 就会访问不不了了内存1。所以说,信号量量也是 进程之间的⼀一种通信⽅方式。 5、Socket 上⾯面我们说的共享内存、管道、信号量量、消息队列列,他们都是多个进程在⼀一台主机之间的通信,那两个 相隔⼏几千⾥里里的进程能够进⾏行行通信吗? 答是必须的,这个时候 Socket 这家伙就派上⽤用场了了,例例如我们平时通过浏览器器发起⼀一个 http 请求,然 后服务器器给你返回对应的数据,这种就是采⽤用 Socket 的通信⽅方式了了。 总结 所以,进程之间的通信⽅方式有: 1、管道 2、消息队列列 3、共享内存 4、信号量量 5、Socket

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UNIX(进程间通信):08 管道通信

    匿名管道是进程间通信中比较简单的一种,他只用于有继承关系的进程,因为匿名,非继承关系的进程无法找到这个管道,也就无法完成通信,而有继承关系的进程,是通过fork...

    用户3479834
  • Linux进程间通信(一) - 管道

    管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道。 例如:ps | grep vsftpd .管道是单向的、先进先出的、无结构...

    三丰SanFeng
  • Linux命名管道及函数

    管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的...

    xxpcb
  • linux 命名管道实例详解

    FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中。命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的...

    砸漏
  • linux系统编程之管道(三):命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的。如果要互相通信的几个进程没有...

    s1mba
  • Linux进程通信之管道解析

    管道是 UNIX系统 IPC的最古老的形式,所有的UNIX系统都提供此种通信。所谓的管道,也就是内核里面的一串缓存,从管道的一段写入的数据,实际上是缓存在内核中...

    wenzid
  • Linux进程通信——有名管道

    管道(pipe)是无名管道,他是进程资源的一部分,随着进程的结束而消失。并且它只能在拥有公共祖先进程的进程内通信。而有名管道(FIFO)的出现则解决了这个问题。...

    zy010101
  • Linux进程通信 管道

    管道是Unix系统IPC的最古老形式,所有Unix系统都提供这种形式。管道有以下两种局限性:

    开源519
  • UNPv2第四章:管道和FIFO

    pipe()会建立管道,并将文件描述词由参数filedes数组返回 filedes[0]为管道里的读取端 ...

    提莫队长
  • Linux——Linux系统编程之进程间的通信-无名管道与有名管道的使用总结

    在RTOS中,任务之间的通信手段有信号量、邮箱、消息队列,在Linux进程间通信,常用的包括:无名管道、有名管道、消息队列、信号、信号量、共享内存、套接字(so...

    Winter_world
  • 由一道面试题来了解进程间的通信

    周末面试碰到一个面试题,题目是: 在MMO游戏中,服务器采用Linux操作系统,网络通信与游戏逻辑处理进程一般是分离的。 例如:GameSvr进程处理游戏逻辑,...

    hbbliyong
  • 进程间通讯(二).fifo(1)

    UNIX/Linux 是多任务的操作系统,通过多个进程分别处理不同事务来实现,如果多个进程要进行协同工作或者争用同一个资源时,互相之间的通讯就很有必要了

    franket
  • Linux进程间通信之管道

    1,进程间通信 (IPC ) Inter-Process Communication   比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。 2,...

    xcywt
  • 进程间通信

    海盗船长
  • Linux进程间通信(上)之管道、消息队列实践

    进程间通信的几种方式:无名管道、有名管道、消息队列、共享内存、信号、信号量、套接字(socket)。

    morixinguan
  • 进程间通信方式有哪些?

    进程能够单独运行并且完成一些任务,但是也经常免不了和其他进程传输数据或互相通知消息,即需要进行通信,本文将简单介绍一些进程之间相互通信的技术--进程间通信(In...

    编程珠玑
  • 记一次面试:进程之间究竟有哪些通信方式? ---- 告别死记硬背

    有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记...

    帅地
  • 进程间通信

    什么是管道? 可以理解为内存中的一个缓冲区,用于将某个进程的数据流导入,由某一个进程导出,实现通信。 再通俗的说,看图:

    看、未来
  • Linux 的进程间通信:管道

    管道,英文为 pipe 。这是一个我们在学习 Linux 命令行的时候就会引入的一个很重要的概念。管道是UNIX 环境中历史最悠久的进程间通信方式。本文主要说明...

    邹立巍

扫码关注云+社区

领取腾讯云代金券