发信人: ben (ben), 信区: Linux 标 题: LPG 6.4.1 SYSTEM V IPC 基本概念 发信站: 逸仙时空 Yat-sen Channel (Sat Dec 25 02:23:46 1999), 站内信件
6.4.1 基本概念
在SYSTEM V,AT&T中引入的IPC(交互进程控制的)机制的三种新方式(消息队列,信 号灯和共享内存)。当POSIX 委员会还没有完成这些机制的标准化的时候,大多数实际 应用已经支持这些机制。另外,Berkeley(BSD) 使用socket为它的主要的IPC方式,而非 SYSTEM V 元素。Linux有能力使用两种方式,我们在以后的章节才会讨论到套接口。
系统V IPC 的Linux 实施由Krishna 写成了 (1)IPC 标识符 (2)IPC 键 (3)ipcs 命令 (4)ipcrm 命令
(1)IPC 标识符 每个IPC对象有唯一一个与之相关联的IPC 标识符。当我们说"IPC 对象", 我们是 说一个消息队列, 信号灯, 或共享内存段.这标识符是在核心以内用来标识单一IPC 对 象.例如,要存取一特别的共享内存段,你需要的唯一的项目是分配给那个段的唯一的ID. 一标识符的唯一性与问题里对象的类型是相关的.要说明这一点, 假定一个数字标 识符"12345".不可能存在两个标识符相同的消息队列,而存在明显可能性的是有相同标 识符的一个消息队列和一共享内存段。
IPC 键 必须使用一个键来要获得一个唯一的ID.而这个键必须是由客户和服务器进程互相 同意的.这出现在为一应用程序构造一客户机/服务器结构的第一步骤在里面. 当你使用一电话给某人时,你必须知道他们的电话号码.另外, 电话公司必须知道 怎样把你的呼叫转送到它的最终的目标.一旦另外的一方回应电话呼叫,连接便形成了. 在SYSTEM V IPC 设施里面 , 使用的对象类型可以被直接看作"电话".而"电话公 司", 或路由选择方法, 能直接与一个IPC 键联系起来.键能在任何时间都有相同的值, 由硬性编码一个键值输入应用程序.这有个不好的地方就是这个键可能已经被使用.经常 地,ftok() 函数被用来为客户端和服务器产生键值 .
库函数: ftok();
原型: key_t ftok ( char *pathname, char proj );
返回: 如果成功 返回新的IPC 键值 如果失败 返回-1, ,errno 设置stat 返回() 调用
从ftok()返回的键值由第一个参数中的文件的索引节号和次要设备号与第二参数中 的一字符的项目标识符组合而成.这并不能保证键的唯一性, 但是应用程序能够检查到冲 突并且重新尝试产生唯一的键.
key_t mykey; mykey = ftok("/tmp/myapp", 'a');
在上面的片断,目录/tmp/myapp 与一字母标识符'a'组合起来. 另外的普通的例子是使用当前目录:
key_t mykey; mykey = ftok(".", 'a');
键的生成算法完全满足应用程序员的谨慎.只要适当地计算来防止竞争情况,死锁, 等等,任何方法都是有效的.为我们的演示目的,我们将使用ftok()途径.如果我们假定所 有客户进程将从唯一"home"的目录运行,产生的键也应该能满足我们的需要.
无论键值是怎样获得的,都可用在随后的IPC 系统调用去创造或获得IPC 对象的 访问.
(3)ipcs 命令 能被用来获得所有的系统V IPC 对象的状态的ipcs 命令. 这工具的Linux 版本也由Krishna Balasubramanian 完成了.
ipcs -q: 仅仅显示消息队列 ipcs -s: 仅仅显示信号 ipcs -m: 仅仅显示共享内存 ipcs --help: 显示附加参数
默认下,三种对象都会显示的. 考虑下列 ipcs 的示范输出:
------ Shared Memory Segments -------- shmid owner perms bytes nattch status
------ Semaphore Arrays -------- semid owner perms nsems status
------ Message Queues -------- msqid owner perms used-bytes messages 0 root 660 5 1
这里我们可以看到有一个标识符为"0"的消息队列.它由用户root拥有, octal 的许可 机制为 660, 或 -rw-rw--.有一个消息在该队列里,那消息有总计大小为5字节. ipcs 命令是查看核心内IPC的存储机制的强大工具.你应该学习它,使用它,重视它.
(4)ipcrm 命令 ipcrm 命令能被用来从内核移除一个IPC对象.
当IPC对象经由用户代码里的系统调用移除的(我们将在迟一点看到是如何发生的), 经常需要, 特别在开发环境下面手工地移去IPC对象. 它的使用是简单的: ipcrm <msg | sem | shm> <IPC ID> 简单地指定已删除的对象是否一消息队列 (msg), 信号灯 (sem),或一共享的内 存段(shm).IPC ID 可由ipcs 命令获得.你必须指定对象的类型,因为标识符在同一 类型之中是唯一的 (回到我们前面的讨论).
-- ※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 192.168.6.99] |