文档章节

3. System V IPC

alon龙武
 alon龙武
发布于 2014/11/17 22:45
字数 1141
阅读 125
收藏 10
点赞 0
评论 0

System V IPC包含三种类型的IPCSystem V消息队列、System V信号量、System V共享内存区


1. key_t键和ftok函数

三种类型的System V IPC使用key_t值作为名字。头文件<sys/types.h>定义key_t为一个至少32位的整数。函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC

#include <sys/ipc.h> key_t ftok(const char *pathname, int id);

ftok的典型实现调用stat函数,然后组合三个值:stat结构的st_dev信息、stat结构的st_info信息、id的低序8位(不能为0)。不能保证不同的路径名与同一个id的组合产生不同的键。

 

2. ipc_perm结构

内核给每个IPC对象维护一个信息结构,内容跟内核给文件维护的信息类似

struct ipc_perm {
    uid_t        uid;           /* owner’s user id */
    gid_t        gid;           /* owner’s group id */
    uid_t        cuid;          /* creator’s user id */
    gid_t        cgid;          /* creator’s group id */
    mode_t       mode;          /* read-write permissions */
    ulong_t      seq;           /* slot usage sequence number */
    key_t        key;           /* IPC key */
};


3. 创建于打开IPC通道

创建或打开一个IPC对象的三个getXXX函数的第一个参数key有两种选择:调用ftok,传递pathnameid指定keyIPC_PRIVATE,保证创建一个新的、唯一的IPC对象。System V IPC定义了自己的IPC_xxx常值

#include <sys/ipc.h> <sys/shm.h> int shmget(key_t key, size_t size, int oflag);
#include <sys/types.h> <sys/ipc.h> <sys/sem.h> int semget(key_t key, int nsems, int oflag);
#include <sys/types.h> <sys/ipc.h> <sys/msg.h> int msgget(key_t key, int oflag);

 

4. IPC权限

oflag参数某些位初始化ipc_perm结构的mode成员

一个进程可通过调用相应IPC机制ctlXXX函数(IPC_SET)修改属主ID,创建者ID却从不改变。三个ctlXXX函数允许一个进程修改某个IPC对象的mode成员。

每当有一个进程访问某个IPC对象,IPC执行两级检查IPC对象被打开时执行一次,每次使用对象时执行一次

  • 每当有一个进程以getXXX函数建立访问某个存在IPC对象的通道时,IPC执行一次初始检查,验证调用者的oflag参数没有指定不在该对象ipc_perm结构mode成员中的任何访问位。创建者和调用者的权限位一致。绕过这种检查的方法:如果已知IPC对象存在,指定一个值为0oflag参数。

  • 每次IPC操作都对使用该操作的进程执行一次权限测试:超级用户总是赋予访问权;如果当前进程的有效用户ID等于IPC对象的uidcuid,而且相应的访问位(如果调用者要在IPC对象执行读操作,那么读位必须设置,如果要执行写操作,那么写位必须设置)在IPC对象的mode成员是打开的。

  • 如果当前进程的有效组ID等于IPC对象的gidcgid,而且相应访问位在IPC对象mode成员中是打开的

  • 如果上面的测试没有一个为真,那么相应的“其他用户”访问位在IPC对象的mode成员中必须是打开的

 

5. 标识符重用

ipc_perm结构的seq变量是一个槽位使用情况序列号,一个由内核为系统每个潜在的IPC对象维护的计数器。每当删除一个IPC对象,内核就递增相应的槽位号,若溢出则循环回0System V IPC标识符是系统范围的,不是特定于进程的。从某个getXXX函数获得一个IPC标识符适用于所有进程。可能导致某些进程尝试不同的小整数标识符,期待找出一个当前允许大家读访问的消息队列。解决办法是把标识符值可能范围扩大到所有整数:每次重用一个IPC表项,把返回给调用者的标识符值增加一个IPC表项数。递增槽位使用情况序列号的另一个原因是避免短时间内重用System V IPC标识符,有助于确保过早终止的服务器重新启动后不会重用标识符。

 

6. ipcs和ipcrm程序

由于System V IPC的三种类型不是以文件系统中的路径名标识的,提供两个特殊程序ipcsipcrmipcs输出有关System V IPC特性的各种信息,ipcrm删除一个System V消息队列、信号量或共享内存区


© 著作权归作者所有

共有 人打赏支持
alon龙武
粉丝 2
博文 14
码字总数 20481
作品 0
深圳
程序员
No space left on device: Couldn't create accept lock

原因: (1) 确认是否是硬盘空间不足;结果发现不是空间的问题; (2) 网上查看了下,发现是ipc不足。可以使用ipcs -s(|grep apache的group) 处理: (1) 可以使用$ ipcrm -s 清理指定 semaph...

极速前行 ⋅ 2016/05/17 ⋅ 0

Linux IPC总结

我看网络上System V IPC 与POSIX IPC总是混在一起搞不清,今天总结一下. System V IPC API 1,消息队列 int ftok(const char *pathname, int prj_id); int msgget(key_t key,int msgflag); int......

jlmpp ⋅ 2010/11/16 ⋅ 0

linux ipc总结(全)

Linux IPC总结(全) 分类: Linux/Unix ABC2011-08-02 11:25 634人阅读 评论(5) 收藏 举报 IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux...

viwii ⋅ 2012/03/30 ⋅ 0

进程之间的通信-消息队列

System V提供的IPC机制主要有消息队列,信号量和共享内存3中机制。使用ipcs命令可以查看系统正在使用的IPC工具 例如: 由上可以看出一个IPC工具只是拥有key值,ID值,创建者和相关权限等信息...

songzhongping ⋅ 2013/08/02 ⋅ 0

SystemVIPC

红薯 ⋅ 2013/08/14 ⋅ 0

【IPC通信】key_t键和ftok函数

System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用keyt值做为它们的名字。keyt这个数据类型在<sys/types.h>有定义,通常是一个至少32位的整数...

恋恋美食 ⋅ 2011/11/11 ⋅ 0

深刻理解Linux进程间通信(IPC)

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实 验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信...

墙头草 ⋅ 2010/11/19 ⋅ 0

zabbix监控oracle 12c

zabbix监控oracle 12c 前言 某公司需要监控Oracle 12C,采用orabbix是zabbix监控oracle数据库的插件,修改一些地方就可以监控了。 一.安装配置 mkdir /opt/orabbix cd /opt/orabbix mv conf...

jxzhfei ⋅ 2016/01/07 ⋅ 0

linux共享内存的设计

posix的共享内存是通过用户空间挂在的tmpfs文件系统实现的,而system V的共享内存是由内核本身的tmpfs实现的,这里可以看出,二者其实是用同一种机制实现的,不同的是用户接口不同,posix旨在...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

unix/linux共享内存应用

共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存区...

barsoom ⋅ 2013/06/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 21分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 27分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 34分钟前 ⋅ 0

Istio-快速安装

Istio是一个服务网格(Service Mesh)软件,可以在Kubernetes中快速安装: 1、创建配置文件 helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/is......

openthings ⋅ 35分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 40分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 40分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 45分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 57分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 今天 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部