加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:IPC总结

发布时间:2016-10-03 06:40:58 所属栏目:Unix 来源:站长网
导读:副标题#e# IPC主要包括:管道,消息队列,信号量,共享内存, 套接字(SOCKET)。 一、IPC对象的持久性 每种IPC机制都会借助一种数据结构,这种数据结构的实例称为该IPC机制的对象(相应的,用于同步互斥的数据结构的实体也可以称为该机制的对象)。理清IPC对

二、System V IPC

System V IPC包含:

System V消息队列

System V信号量

System V共享内存区

System V IPC具有一些共同的属性,使用key_t类型的值作为其名字;每个IPC对象有一个与之关联的ipc_perm结构、IPC权限。

1.System V IPC函数汇总

UNIX环境高级编程:IPC总结

2.key_t键和ftok函数

三种类型的System V IPC使用key_t值作为他们的名字。头文件<sys/types.h>把key_t这个数据类型定义为一个整数,它通常是一个至少32位的整数。这些整数值通常是ftok函数赋赋予的。

函数ftok把一个已经存在的路径和一个整数标识符转换为一个key_t值,叫IPC键(IPC key).

ftok典型的实现调用stat函数,然后组合以下三个值:

1. pathname所在文件系统的信息;

2. 该文件在本文件系统内的索引节点号;

3. id的低序8位;

如果pathname不存在或者当前进程不能访问该文件,则ftok返回-1,另外需要注意的是其pathname用于产生key的文件在使用ftok产生的key的进程运行期间不能被创建和删除,因为每次文件被创建,它会需要一个新索引结点编号,这就会导致下次使用ftok时获得了一个不同的key。

3.ipc_perm结构

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

struct ipc_perm  
{  
   uid_t uid;//owner的用户ID  
   gid_t gid;//owner的组ID  
   uid_t cuid;//creater的用户ID  
   gid_t cgid;//creater的组ID  
   mode_t mode;//读写模式  
   ulong_t seq;//序列号  
   key_t key;//IPC key  
};

4.创建与打开IPC通道

创建或打开一个IPC对象的三个getXXX函数的都需要一个类型为key_t的IPC键的key值,并且返回一个整数标识符。该标识符不同于ftok函数的id参数。对于key值,应用程序有两种选择:

调用ftok,给它传递pathname和id;

指定key为IPC_PRIVATE,这将保证会创建一个新的、唯一的IPC对象;

三个getXXX函数,都有一个oflag参数,他指定IPC对象的读写权位,并选择是创建一个新的IPC对象还是访问一个已存在的IPC对象,规则如下:

1.key指定为IPC_PRIVATE能保证创建一个唯一的IPC对象。没有一对id和pathname的组合会导致ftok产生IPC_PRIVATE这个键值;

2.设置oflag参数的IPC_CREAT位但不设置它的IPC_EXCL位时,如果指定键的IPC对象不存在,那就创建一个新对象,否则返回该对象;

3.设置oflag参数的IPC_CREAT位和它的IPC_EXCL位时,如果所指定键的IPC对象不存在,那就创建一个新的对象,否则返回一个EEXIST错误,因为该对象已经存在;

4.如果要访问一个已经存在的IPC,就不能指定IPC_PRIVATE标记,因为这是一个特殊的用于创建IPC对象的键值

5.IPC权限

创建一个新的IPC对象时,以下信息就保存该对象的ipc_perm结构中:

1. oflag参数中某些比特会初始化ipc_perm结构的mode成员。

2. cuid和cgid成员分别设置为调用进程的有效用户ID和有效组ID。这两个成员合称为创建者ID。

3. ipc_perm结构的uid和gid成员也分别设置为调用进程的有效用户ID和有效组ID。这两个成员合称为所有者ID。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读