Linux IPC 方式 要点解析

持续更新中…

https://www.cnblogs.com/sallyliu/p/6385806.html //管道
https://www.cnblogs.com/wuyepeng/p/9748728.html //消息队列
https://www.jianshu.com/p/5c970093b07c // System V IPC

管道

管道的特点

1、半双工,写端描述符,读端描述符,单向流动,有管道容量限制。
2、只能用于有血缘关系的进程之间通信。
3、有无名管道和有名管道,顾名思义,无名管道用完即丢弃,句柄无法重复利用。
4、从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
5、只能默认地接收数据。

管道的应用

读出文件内容后,通过管道转发给grep(可以处理错误,比如出错时打印到屏幕或另一个文件)

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,
它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、
egrep和fgrep。Windows系统下类似命令FINDSTR。

System V IPC三剑客

三种System V IPC对象:消息队列、信号量以及共享内存(共享存储器)之间有很多相似之处。

System V IPC对象的统一属性,总结如下:
1)键key : 一个由用户提供的整数,用来标志这个资源的实例
2)创建者creator: 创建这个资源的进程的用户ID(UID), 组ID(GID)
3)所有者owner:资源的所有者的UID和GID
4)权限permisss:文件系统类型的权限.

每个内核中的 IPC结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符
( identifier )加以引用。

无论何时创建IPC结构(调用msgget、 semget或shmget) ,都应指定一个关键字(key),关
键字的数据类型由系统规定为 key_t,通常在头文件<sys/types.h>中被规定为长整型。关键字由
内核变换成标识符。

共享内存

1、共享内存区域是被多个进程共享的一部分物理内存。进程可以把这些区域映射到它们地址空间的任一合适的虚拟地址范围。这些地址范围对每一个进程来说可以是不同的。映射后,这些区域就可以像其他任何内存位置那样被访问,而不需要对它使用读read或写write调用。
2、共享内存机制提供了进程共享数据的最快方法。进程向共享内存区域写入数据,那么共享这个区域的所有进程可以立即看见共享区域中的新的内容。
3、如同访问所有System V IPC对象的方法一样,访问共享内存要通过关键字和访问权限来控制。访问权限和关键字是有共享内存的创建者来设置的。
4、一旦内存共享出来,Linux就不检查进程是如何使用这个共享内存了。所以,要安全的使用共享内存,必须依靠其他机制,例如使用信号量来同步访问共享内存。

值得一提的是,共享内存这种技术有两种实现方式
第一种:mmap方式,适用场景:父子进程之间,创建的内存非常大时。

第二种:shmget方式,适用场景:同一台电脑上不同进程之间,创建的内存相对较小时。

https://blog.csdn.net/wlh_flame/article/details/6328380 

具体这两种实现的差异可以参考上面这篇文章。

消息队列

消息队列的特点

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。
与管道对比:
1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。
2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。
3、接收程序可以通过消息类型有选择地接收数据(不一定要FIFO的取数据),而不是像命名管道中那样,只能默认地接收。
4、消息队列允许一个或者多个进程写消息,同样这个消息可以被一个或多个进程读取。

消息队列的读写

写:Linux对消息的数量和长度都有限制,如果系统中没有足够的空间容纳新消息,那么要发送消息的进程将被加到消息队列的写等待队列中,当系统中有消息被读取时,消息队列有多的空间容纳新消息时,这个进程将被唤醒。
读:读取消息可以指定消息类型也可以指定读取队列中第一个消息.若没有消息符合读取进程的选择标准, 那么这个读取进程就加到消息队列的读等待列表中.当一个新消息写到消息队列中后,这个进程将被唤醒,重复上面的工作.

信号量

1、信号量是为了控制进程对资源的使用而发明的.
2、信号量可以用来实现一些同步协议.实现同步锁的功能
3、信号量是具有整数值的对象,他的工作原理如下: 他支持两种原子操作P和V,P操作减少信号量的值,如果某一个信号量的值小于0,则操作阻塞;V操作增加信号量的值,如果结果值大于等于0,V操作就要唤醒一个等待进程。这两个操作是原子的,即他们是最小操作,不可分割.。

经常与共享内存一起使用。

总结:类似于一个不断执行原子操作的计数器,用于控制资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值