ipc基础
ipc对象持久性
- 进程持久性:具有这种持久性的对象在持有它的最后一个进程关闭了该对象为止
- 内核持久性:这种IPC对象一直存在直到内核重新自举或显示删除该对象为止
- 文件系统持久性:具有这种持久性的对象只有在它被显式删除时才会消失。即使内核重新自举该对象还保持(POSIX消息队列,信号量,共享内存如果是使用映射文件实现的,那么他们就是随文件系统持续的)。少有进程能不受系统重启的影响;而且使用文件系统持久性也可能会降低该IPC机制的性能
管道或FIFO尽管是随进程持续而不是随内核持续,但是管道中的数据在内核中维护,最后一个将某个管道打开着用于读的进程关闭该管道后,内核将丢弃所有的数据并删除该管道
| 类型 | 持久性 |
|
管道 FIFO |
进程持久性 进程持久性 |
|
Posix互斥锁 Posix条件变量 Posix读写锁 Fcntl记录锁 |
进程持久性 进程持久性 进程持久性 进程持久性 |
|
Posix消息队列 Posix命名信号量 Posix信号量 Posix共享内存 |
内核持久性 内核持久性 进程持久性 内核持久性 |
|
System V消息队列 System V信号量 System V共享内存 |
内核持久性 内核持久性 内核持久性 |
|
TCP socket UDP socket Unix域socket |
进程持久性 进程持久性 进程持久性 |
命名空间
当两个或多个无亲缘关系的进程使用某种类型的ipc对象交换彼此的信息时,ipc必须有一种某种形式的名字或标识符
消息队列,信号量,共享内存都可以是用路径名标示,这些名字即可以是文件系统的真实名字也可能不是
- 他必须符合已有路径规则,最多由PATH_MAX个字节构成,包括结尾的空字符
- 如果以斜杠开头,那么对这些函数的不同调用将访问同一个队列,如果他不以斜杠开头,那么效果取决于实现
- 名字中额外的斜杠符的解释由实现定义(名字必须以一个斜杠开头,并且不能在含有任何其他斜杠符,必须在根目录中有写权限)
- 当创建一个新的消息队列,信号量或共享内存区对象时,其用户id被设置为当前进程的有效用户id,信号量或共享内存区对象的组id被设置为当前进程的有效组id或某个系统默认的组id,新消息队列对象的组id被设为当前进程的有效组id,由open新创建的文件的组id或者是当前进程的有效组id,或者是该文件所在的目录的的组id,但是ipc函数不能假定系统为ipc创建一个在文件系统中的路径
S_TYPEISMQ(buf)
S_TYPEISSEM(buf)
S_TYPEISShM(buf)
这三个宏他们的单个参数是指向某个stat的结构指针,其内容由fstat,lstat或stat这三个函数填入,如果所指的IPC对象(消息队列,信号量,共享内存)是作为一种哦特殊的文件了型实现的,而且所指的stat结构访问这样的文件类型,那么这三个宏计算出一个非零值,否则,计算出的的值为0
ipc权限
unix内核执行权限测试
- 如果当前进程的有效用户id为0(超级用户),允许访问
- 在当前进程的有效用户id等于该ipc对象的属主id的前提下,如果相应的用户访问权限位(解释:如果当前进程为读访问而打开ipc对象,那么用户读权限位必须设置;如果当前进程为写访问而打开ipc对象,那么用户写权限位必须设置)已设置,那就允许访问,否则拒绝访问(即:如果当前进程拥有某个ipc对象,那么访问权的授予与拒绝只依赖用户访问权限——组访问权限不会考虑,类似,如果当前进程不拥有该ipic对象,但它属于某个合适的组,那么访问权限的授予与拒绝只依赖于组访问权限——其他用户访问权限绝不会考虑)
- 在当前进程的有效组id或它的某个辅助组id等于该ipc对象的组id的前提下,如果相应的组id访问权限位已设置,那么允许访问,否则拒绝访问
- 如果相应的其他用户访问相应的权限位已设置,那么就允许访问,否则拒绝访问
调用fork,exec,_exit对IPC对象影响
| 类型 | fork | exec | _exit |
| 管道和FIFO | 子进程获得父进程的所有打开的描述符的拷贝 | 除非描述符的FD_CLOSEXEC比特被置位了,否则描述符保持打开状态 | 所有描述符都被关闭,在描述符最后一次被关闭时,管道或FIFO中的数据会被删除 |
| Posix消息队列 | 子进程获得父进程的所有打开的消息队列描述符的拷贝 | 所有打开的消息队列的描述符都被关闭 | 所有打开的消息队列的描述符都被关闭 |
| System V消息队列 | 没影响 | 没影响 | 没影响 |
| Posix互斥锁和条件变量 | 如果在共享内存中并且设置了进程共享属性则就被共享 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 |
| Posix读写锁 | 如果在共享内存中并且设置了进程共享属性则就被共享 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 |
| Posix(基于内存的)信号量 | 如果在共享内存中并且设置了进程共享属性则就被共享 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 | 除非位于仍被打开的共享内存中并且具有进程共享属性否则就将消失 |
| Posix命名信号量 | 在父进程被打开的在子进程中仍保持打开 | 所有被打开的都将被关闭 | 所有被打开的都将被关闭 |
| System V信号量 | 所有的semadj的值在子进程中被设置为0 | 所有的semadj的值被传递给新的程序 | 所有的semadj的值被加到相应的信号量上 |
| 记录锁 | 父进程持有的锁不会被子进程所继承 | 只要描述保持打开,锁就不会因为exec的动作而变化 | 所有被进程持有的锁都会被释放 |
| mmap共享内存 | 父进程的共享内存被子进程保留 | 共享内存被unmapped | 共享内存被unmapped |
| Posix共享内存 | 父进程的共享内存被子进程保留 | 共享内存被unmapped | 共享内存被unmapped |
| System V共享内存 | 父进程中已连接上的共享内存被子进程保留 | 共享内存被deattached | 共享内存被deattached |
可以用ipcrm命令删除系统中的残留资源。
ipc基础的更多相关文章
- Linux IPC基础(System V)
简介 IPC 主要有消息队列.信号量和共享内存3种机制.和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具: 由以上可以看出,一个 IPC 至少包含 ...
- 基于传统IPC基础上的RTMP互联网推流摄像机方案设计
在我之前的一篇博客<EasyRTMP内置进入摄像机中实现网络推流直播摄像机的功能>中,我阐述了一种将RTMP推流内置到摄像机系统内部,实现安防摄像机转互联网直播的RTMP推流摄像机功能,如 ...
- Android IPC机制基础
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android之IPC机制
Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...
- 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
2.1 Android IPC简介 (1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来 ...
- Android中的IPC机制
Android IPC简介 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程 ...
- Android IPC机制全解析<一>
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android开发艺术探索——第二章:IPC机制(上)
Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...
- 二、IPC机制
1.Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程. ANR:Applicatio ...
随机推荐
- 【Python】【装饰器】
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- tcp协议以及socket介绍
壹:tcp协议:可靠传输 一: 3次握手,建立链接:4次挥手,断开链接 3次握手,建立链接:图解 ,这样双向通路就建立完成了. 在建立链接时,并没有数据传输,所以中间两部可以合在一起,也就是3次握手, ...
- Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
- js的点滴2
博客: 1.大牛博客:每一篇博客都需要仔细的看.http://blog.csdn.net/hongchh/article/details/54744318 2.layui:的作者 贤心的博客:http ...
- 7.7 GRASP原则七: 纯虚构 Pure Fabrication
GRASP原则七: 纯虚构 Pure Fabrication 如果依据信息专家原则获得的解决方案不合适,既不想违反低耦合.高内聚,也不想违 反其他的原则, 该如何把职责分配给对象? 左右为难… ...
- 『Python CoolBook』Cython
github地址 使用Cython导入库的话,需要一下几个文件: .c:C函数源码 .h:C函数头 .pxd:Cython函数头 .pyx:包装函数 setup.py:python 本节示例.c和.h ...
- 『计算机视觉』感受野和anchor
原文链接:关于感受野的总结 论文链接:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks ...
- tensorflow world language model
上文提到了pytorch里的world language model,那么怎么能不说tensorflow的实现呢,还是以tensorflow ptb的代码为例说说. 地址: https://githu ...
- springboot启动插件
对jsp支持后不再使用启动类启动项目,否则无法支持jsp <plugins> <plugin> <groupId>org.springframework.boot& ...
- 2010-10-08在浏览器中兼容+jQuery3
一.实现背景图片铺满(兼容各种浏览器) <script type="text/javascript"> $(document).ready(function() { $ ...