文档章节

3. System V IPC

alon龙武
 alon龙武
发布于 2014/11/17 22:45
字数 1141
阅读 134
收藏 10

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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消息队列、信号量或共享内存区


© 著作权归作者所有

上一篇: 6. 地址解析协议
下一篇: 2. Posix IPC
alon龙武
粉丝 2
博文 14
码字总数 20481
作品 0
深圳
程序员
私信 提问
加载中

评论(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
0
System V 与 POSIX 简介与对比

当我们在 Linux 系统中进行进程间通信时,例如信号量,消息队列,共享内存等方式,会发现有System V以及POSIX两种类型。今天我们就来简单介绍下它们。 POSIX: POSIX(Portable Operating Sys...

osc_e4gzv47r
2018/02/08
2
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
771
0
四十九、进程间通信——System V IPC 之消息队列

49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号、管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息队列、共享内存和信号量 IPC 对象(...

osc_fhvb0ylb
2019/01/24
2
0
linux进程间通信之System V 信号量(semaphore)用法详解

信号量是一种不同进程或不同线程间的同步方法,有System V信号量和Posix信号量。 本文介绍System V 信号量,其在内核中维护,可用于进程间或线程间的同步,本文只介绍进程间同步。 信号量一般...

osc_tm2zceka
2018/06/25
13
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP设计模式

设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数...

php开源社区
8分钟前
4
0
Android反编译(一) 之反编译JAVA源码

Android反编译(一) 之反编译JAVA源码 [目录] 1、工具 2、反编译步骤 3、实例 4、装X技巧 1、工具 1).dex反编译JAR工具 dex2jar http://code.google.com/p/dex2jar/downloads/list 2).JAVA反编...

osc_l8ylygdq
8分钟前
9
0
解决layer.open中访问地址携带参数过长导致的问题(Request-URI Too Long)

由于layer.open是get传参,而get传参有长度限制,当携带参数数据过多时就由于参数过多出错,试过换成post请求,但是由于原方法返回的是页面,使用post返回的只能是数据,通过返回的数据再lay...

郭周园
9分钟前
7
0
parted命令分区

[root@KING ~]# parted /dev/sdb1 =》进行分区 (parted) mklabel gpt =》通过mklabel调整分区表,调整为gpt类型 Warning: The existing disk label on /dev/sdb will be destroyed and all d......

osc_eijo4qvb
9分钟前
6
0
苹果mac电脑的移动硬盘无法挂载且硬盘灯一直闪烁,怎么办?

小编近日遇到一个诡异的问题,小编的移动硬盘不定期的会自动断开,提示未正常拔出,实际上一直没有动过连接线,然后硬盘一直处于未加载的状态,硬盘灯也一直闪烁不停。 通过重启的方法,有时...

mac小叮当
10分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部