在ipc通信中 system V 模式的ipc通信中都需要一个key值来生成对应的ID,那么key是如何生成的呢?
通过函数ftok生成
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
- 参数:
pathname: 传入一个路径(一般是当前路径“ . ”)
proj_id : 随便填写一个数(要做通信的话通信的另外一端要与这个数保持一致才能找到对应的icpID) - 返回值: 生成一个独有的数
- 具体如何生成?
key 31-24 proj_id 低8位
key 23-16 pathname的st_dev属性的低8位
key 15-0 pathname的st_ino属性的低16位 - 32位组合而成一个int值,就是我们的ftok的返回值了
demo
#include<sys/ipc.h>
#include<stdio.h>
#include<sys/stat.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
key_t key;
int i;
struct stat buf;
if(argc!=3)
{
printf("use: command path number\n");
return 1;
}
i=atoi(argv[2]);
if((stat(argv[1],&buf))==-1)
{
perror("stat");
exit(EXIT_FAILURE);
}
printf("file st_dev=0x%x\n",buf.st_dev);
printf("file st_ino=0x%x\n",buf.st_ino);
printf("number=0x%x\n",i);
key=ftok(argv[1],i);
printf("key=0x%x \tkey>>24=%x \tkey&0xffff=%x \t(key>>16)&0xff=%x\n",key,key>>24,key&0xffff,(key>>16)&0xff);
}
执行效果