Linux进程间通信机制详谈

Linux进程间通信机制

Unix系统提供的进程间通信机制主要有:

  • 管道和FIFO(命名管道)
  • 套接字
  • 信号
  • 信号量
  • 消息队列
  • 共享内存区
管道pipe

在这里插入图片描述

管道机制思想是在内存中创建一个共享文件,从而使得通信双方利用该共享文件进行交互。需要注意的是管道数据流动是单向的,是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。管道只在具有公共祖先的两个进程之间使用,可以将管道视为一个独立的文件系统,管道在管道两侧的进程看来就是一个文件,只是这个文件只存在于内存中。

一个进程写入管道的所有数据由内核定向到另一个进程,另一个进程就可以从管道中读取数据。当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。

在Unix的shell中,通过 “|” 创建管道(样子就像管道一样),将前面的进程的标准输出重定向到管道中,然后后面的进程从管道中读取输入。

管道的创建:应用程序调用pipe系统产生管道,该调用将返回两个文件描述符,分别用于管道的两侧。由于两个描述符位于同一个进程,因此进程自身通信,好像没太大作用,但是通过fork或者clone复制进程时管道也会被复制,因此管道通信就是利用该性质,实现了具有公共祖先的进程之间的通信。

常用的操作就是创建一个连接到另一个进程的管道,然后将其输出或向其输入端发送数据。标准IO库提供了两个函数,popen 和 pclose,这两个函数可以实现:创建一个管道,fork一个子进程,关闭未使用的管道端,执行一个shell运行命令,等待命令终止。

管道具有局限性:只支持单向数据流,没有名字,缓冲区有限等

命名管道FIFO

管道很简单灵活有效,但是有一个比较大的缺点,那就是无法打开已经存在的管道,即两个进程不能共享同一个管道,同时匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。故Unix引入了命名管道,或称为FIFO(先进先出),因为这是一种最先写入文件的字节总是最先被读出的特殊文件类型。

FIFO文件包含在系统的文件树中,即拥有磁盘索引节点。因此哪怕没有亲缘关系的进程也可以通过该方式消息传递。

  • FIFO的索引节点出现在系统目录树上
  • FIFO是一种双向通信管道,即一个进程可以以读/写模式打开一个FIFO

通过mkfifo函数创建FIFO文件,之后可以用open打开它。命名管道在打开时需要确实该管道已经存在,否则将阻塞。即以读方式打开某管道,在此之前必须一个进程以写方式打开管道,否则阻塞。此外,可以以读写(O_RDWR)模式打开有名管道,即当前进程读,当前进程写,不会阻塞。
在这里插入图片描述

消息队列

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值