UNIX情形高级编程: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函数汇总 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。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |