songhuanlinux 2018-02-05
IPC 主要有消息队列、信号量和共享内存3种机制。和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具:
由以上可以看出,一个 IPC 至少包含 key值、ID值、拥有者、权限和使用的大小等关键信息。如果需要手工删除某个 IPC 机制,可以使用 ipcrm 命令。
IPC 在实现时编写使用 key 值作为参数创建,如果在创建时使用相同的 key 值将得到同一个 IPC 对象的 ID,这样就保证了双方可以获取用于传递数据的 IPC 机制 ID 值。key 值为一个32位的整型数据。Linux 提供函数 ftok() 来创建 key 值。
#include <sys/types.h> #include <sys/ipc.h> /* pathname 为文件路径名,第2个参数为 int 型变量 */ key_t ftok(const char *pathname, int proj_id);
每个文件都有其自身的属性,可以通过 stat() 函数读取,在 ftok() 函数创建 key 值过程中使用了该文件属性的 st_dev 和 st_ino 。具体构成如下:
如果使用 ftok() 函数的参数是相同的,那么得到的 key 值是唯一的。所以说两个进程使用相同的参数创建同类 IPC 的话,就可以实现进程间的通信。
用以下程序来演示 key 值各位的组成:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/stat.h> #include <unistd.h> int main(int argc, char **argv) { int arg, key; struct stat buf; arg = atoi(argv[2]); key = ftok(argv[1], arg); printf("Key : %x \n\n", key); stat(argv[1], &buf); printf("argv[2] low 8 bits : %x \n", arg & 0x0ff); printf("st_dev low 8 bits : %x \n", buf.st_dev & 0x0ff); printf("st_ino low 16 bits : %x \n", buf.st_ino & 0x0ffff); return 0; }
运行结果如下:
要访问任何一个 IPC 工具需要对该 IPC 工具拥有相应的权限,一个 IPC 工具所具有的 IPC 访问权限定义为 struct ipc_perm。其成员定义如下:
补充 stat 结构体: