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 ...
随机推荐
- 小程序之 tab切换(选项卡)
好久没有写东西了 今天写一个简单的东西 小程序tab切换 (选项卡功能) .wxml <view class="swiper-tab"> <view < ...
- HADOOP HA 踩坑 - 所有 namenode 都是standby
报错: 无明显报错 状况: 所有namenode都是standby,即ZK服务未生效 尝试一:手动强制转化某个namenode为active 操作:在某台namenode上,执行 hdfs haadm ...
- Javascript 字典应用实例
字典时一个很有用的工具,在之前C#项目中有经常使用,这篇博文主要讲解在Javascript中,字典的实际应用场景 首先在JS中,是没有Dictionary‘类的,我们需要实现键值(KEY) -- 数值 ...
- AI robots CodeForces - 1045G (cdq分治)
大意: n个机器人, 位置$x_i$, 可以看到$[x_i-r_i,x_i+r_i]$, 智商$q_i$, 求智商差不超过$k$且能互相看到的机器人对数. 这个题挺好的, 关键是要求互相看到这个条件, ...
- 把旧系统迁移到.Net Core 2.0 日记 (19) --UI转用adminLTE
之前用JEasyUI,它的datagrid比较强大,但region的布局界面就太简陋了. 把布局界面改成adminLTE 左边菜单要做成动态,从xml文件加载, 可以参考NOPCommerce的源码来 ...
- linux服务管理 服务管理
系统的运行级别 运行级别 0 关机(不能设置) 1 单用户模式,类似windows的安全模式 2 不完全的命令行模式,不含NFS服务(文件共享的服务) 3 完全的命令行模式,就是标准字符界面 4 系统 ...
- asp.net ajax控件选项卡控件的选项卡的动态显示与隐藏问题
if (dq_gly.Yhm != "admin") { this.TabContainer1.Tabs[0].Visible = false; this.TabContainer ...
- 内建函数之:reduce()使用
#!/usr/bin/python#coding=utf-8'''Created on 2017年11月2日 from home @author: James zhan ''' print reduc ...
- java将所有的字符串转换为大写或小写
public class DaXie { public static void main(String[] args) { /**将所有的字符串转换成大写或小写字母并打印出来*/ String str ...
- Django--filter(**kwargs)
Django--filter(**kwargs)-exclude(**kwargs) filter() 说明: 数据的过滤 返回Queryset包含与给定查找参数匹配的新对象.这里需要特别注意的地方就 ...