Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2697304
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: LINUX

2014-04-16 21:40:28


关于unix的共享内存函数ftok参数的疑问

ftok(pathname,0x03);   //我知道0x03是一个文件的ID,但是具体这个文件是什么文件,我们怎么找到他
首先,0x03不是你认为的一个文件。ftok(char* pathname, int proj_t );它是生成一个key的函数。第一个参数不用解释都知道是一个文件路径吧,第二个参数的最后8位(只有后八位有效,0-255)与第一个参数一起确定一个key.(常用于进程)。比如:我们在开发一个项目的时候,有可能不同人需要在同一个路径下编写代码,防止大家不小心使用了相同的key,一般项目经理会分配给每个人不同的proj_t ,这个时候就可以用当前路径pathname和proj_t生成所需的key。
提问者评价
开始懂了,同一个proj_t不可以出现在同一个路径


key_t键和ftok函数(转)

http://www.cnblogs.com/lihaozy/archive/2012/08/07/2626391.html

key_t键和ftok函数(转)

其实更加应该提醒我们的是,可以使用grep等工具去自己search the answer!

 

key_t键

System V IPC使用key_t值作为它们的名字,在Redhat linux(后续验证默认都在该平台下)下key_t被定义为int类型,追溯如下:

/usr/include/sys/ipc.h

#ifndef __key_t_defined

typedef __key_t key_t;

#define __key_t_defined

#endif

/usr/include/bits/types.h

typedef __DADDR_T_TYPE __daddr_t; /* The type of a disk address.  */ 
typedef __SWBLK_T_TYPE __swblk_t; /* Type of a swap block maybe?  */ 
typedef __KEY_T_TYPE __key_t;   /* Type of an IPC key */

/usr/include/bits/typesizes.h

#define __KEY_T_TYPE              __S32_TYPE

/usr/include/bits/types.h

#define       __S32_TYPE              int

ftok函数

  函数ftok把一个已存在的路径名和一个整数标识得转换成一个key_t值,称为IPC键:

       # include 
       # include

       key_t ftok(const char *pathname, int proj_id);

DESCRIPTION 
       The ftok function uses the identity of the  file  named  by  the  given pathname  (which  must  refer  to an existing, accessible file) and the least significant 8 bits of proj_id (which must be nonzero) to generate  a  key_t  type  System  V  IPC  key。

    该函数把从pathname导出的信息与id的低序8位组合成一个整数IPC键。

sample:

  #include        "unpipc.h"

  int main(int argc, char **argv) 
  { 
        struct stat     stat;

        if (argc != 2) 
                err_quit("usage: ftok ");

        Stat(argv[1], &stat); 
        printf("st_dev: %lx, st_ino: %lx, key: %x/n", 
              (u_long) stat.st_dev,
(u_long) stat.st_ino, 
              Ftok(argv[1], 0x57));

        exit(0); 
  }

程序运行结果:

      [cbs@linux svipc]$ ./ftok  /tmp/mysql.sock 
     st_dev: 802, st_ino: 34219, key: 57024219

ftok的典型实现调用stat函数,然后组合以下三个值: 
1.pathname所在的文件系统的信息(stat结构的st_dev成员) 
2.该文件在本文件系统内的索引节点号(stat结构的st_ino成员) 
3. proj_id的低序8位(不能为0)
从程序运行的结果可以看出,ftok调用返回的整数IPC键由proj_id的低序8位,st_dev成员的低序8位,st_info的低序16位组合而成。
 
不能保证两个不同的路径名与同一个proj_id的组合产生不同的键,因为上面所列三个条目(文件系统标识符、索引节点、proj_id)中的信息位数可能大于一个整数的信息位数。

阅读(805) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~