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 ...
随机推荐
- freecodecamp数字转化成罗马数字
做数字转罗马数字时,用到了贪心算法,很好用,记录一下,有时间系统的学一下 罗马数字的规则: 罗马数字网址 1 5 10 50 100 500 1000 I V X L C D M1 1当一个符号在一个 ...
- Rancher2.0中使用外置NFS存储部署Nginx实验
目录: 1.环境准备工作 1.1 准备好Rancher2.0集群环境 1.2 准备好外部NFS服务器 2.Rancher2.0中使用NFS存储的方法 2.1 在集群中创建持久卷(PV) 2.2 在项目 ...
- angular 2 animation 结构笔记 version 4.2.2
import { Component, Input, OnInit } from '@angular/core'; import { trigger, state, style, animate, t ...
- HihoCoder - 1142 ,三分入门
先来说说三分的思想: 从三分法的名字中我们可以猜到,三分法是对于需要逼近的区间做三等分: 我们发现lm这个点比rm要低,那么我们要找的最小点一定在[left,rm]之间.如果最低点在[rm,right ...
- 20165309 2017-2018-2《Java程序设计》课程总结
20165309 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:技能学习经验与C语言 预备作业3:Linux安装及学习 ...
- matplotlib各图形绘制
2D图形 import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.py ...
- mysql添加字段语句
1.添加 varchar类型的字段: alter table b_warehouse_message add column entity_warehouse_no_test varchar(48) C ...
- django1
* <pre>━━━━━━神兽出没━━━━━━ * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ 王 ┃ * ┃ ┃ * ┃ ┳┛ ┗┳ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ...
- mac 配置php+php_fpm+nginx
首先brew安装前面文章上有的 安装nginx brew install nginx #启动nginx sudo nginx #测试配置是否有语法错误 sudo nginx -t 测试成功 如果不加 ...
- 浅谈对象的两个方法:Object.keys() ,Object.assign();
1 : Object.keys(obj) 返回给定对象的所有可枚举属性的字符串数组 例子1: var arr = [1, 2, 6, 20, 1]; console.log(Object.keys(a ...