1、概述 System V IPC共有三种类型:System V消息队列、System V 信号量、System V 共享内存区。 System V IPC操作函数如下: 2、key_t键和ftok函数 三种类型的IPC使用key_t值作为他们的名字,头文件<sys/types.h>把key_t定义为一个整数,通常是一个至少32位的整数,由ftok函数赋予的。函数ftok把一个已存的路径和一个整数标识符转换成一个key_t值,称为IPC键。函数原型如下: #include <sys/types.h>#include <sys/ipc.h> 写个程序看看ftok是如何组合IPC键,程序如下: View Code
在Ubuntu上程序测试结果如下: 可以看出在Linux上面IPC键使用的是id低8位,st_dev的低8位以及st_ino的低16位构成的。 3、ipc_perm结构 内核给每个IPC对象维护一个信息结构,内容跟内核给文件维护的信息类似。Unix下结构信息如下: struct ipc_perm 在Linux该结构信息如下: 4、创建与打开IPC通道 对于key值,有两种选择: (1)调用fotk函数,给它传递pathname和id。 (2)指定key为IPC_PRIVATE,保证会创建一个新的、唯一的IPC对象。 5、IPC权限 For semaphores (from sys/sem.h) For message queues (from sys/msg.h) For shared memory (from sys/shm.h) 6、标识符重用 System V IPC 标识符是系统范围的,不是特定于进程的。ipc_perm结构含有一个名为seq的变量,是内核为系统每个潜在的IPC对象维护的计数器,每当删除一个IPC对象时,内核就递增相应的槽位号,若溢出则循环到0。这样避免短时间内重用System V IPC标识符,有助于确保过早终止的服务器重新启动后不会重用标识符。写个程序测试输出有megget返回的前10个标识符值,程序如下: View Code
在Ubuntu上面测试结果如下: 7、ipcs和ipcrm程序 System V IPC的三种类型不是以文件系统中的路径名标识的,不能使用ls和rm程序查看和删除。而是同ipcs程序输出System V IPC特性的各种信息,ipcrm则删除一个System V 消息队列、信号量或共享内存区。 ipcs - 分析消息队列、共享内存和信号量 输出本机所有System V IPC消息如下: ipcrm - 删除ipc(清除共享内存信息) 8、内核限制 System V IPC的多数实现在有内在的内核限制,如消息队列的最大数目、每个信号集的最大信号量数等等。 |
|