ftok函数的key值是如何产生的

函数原型
 key_t    ftok(const char *pathname, int proj_id)
函数作用
返回一个key值,这个键值是唯一的,可以用它来识别文件,作为文件的身份证号。之后通信就可以使用这个键值。
参数介绍
pathname:是指定文件名,这个文件必须是存在的而且可以访问的。ftok根据路径名,提取文件信息,再根据这些文件信息及project ID合成key,该路径可以随便设置。
proj_id:自序号,可以根据自己的约定,随意设置。这个数字,有的称之为project ID; 在UNIX系统
上,它的取值是1到255,之后的返回值跟这个有关
疑问1:key值如何产生的,是随机的吗,如果不是,其中产生的原理是怎样的?
key值产生不是随机的。key值的产生和文件的索引节点号和参数proj_id有关。
通常是将文件的索引节点取出,然后在前 面加上子序号就得到key_t的值。
ftok根据路径名,提取文件信息,再根据文件信息中的索引节点号 及project ID 合成key,该路径可以随便设置,但是文件一定要是存在。因为索引号对弈文件来说是唯一的,所以可充当文件的身份
证号。
从以下实验中可以知道 ftok获取的键值是由ftok()函数的第二个参数的后8个bit,st_dev(设备文件的设备号)的后两位,st_ino(索引节点号)的后四位构成的。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
    char filename[50];
    struct stat buf;
    int ret;
    strcpy( filename, "/home/satellite/" );
    ret = stat( filename, &buf );
    if( ret )
    {
        printf( "stat error\n" );
        return -1;
    }
    printf( "the file info: ftok( filename, 0x27 ) = %x, st_ino = %x, st_dev= %x\n", ftok( filename, 0x27 ), buf.st_ino, buf.st_dev );
    return 0;
}

疑问2:为什么索引节点号就可以代表文件?
这个号码其实是另外一个东西的身份证,那就是索引节点,也就是inode,好像讲了一句废话。在索引节点里存放着文件的各种属性信息。
在硬盘里有两个区域,一个是区域是用来存放数据,一个是用来存放 储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。
 每创建一个文件,系统就会分配一个索引节点给这个文件。这其中二者的关系很有趣,文件只可
以唯一地对应一个索引节点,但是索引节点可以对应多个文件。
Inode块中保存了一个文件系统中的全部Inode节点。也就是说,当系统创建了一个文件(或者添加了一个新设备)时,系统就会从这个块中给 这个文件分配一个Inode节点。在这个节点中存储了这个文件的大部分属性,如创建、修改时间等等。但是需要注意的是,有两个属性不包含在这个inode 节点中,分别为文件名与节点号。这主要是因为inode节点按顺序排列,所以系统内核就可以采用简单的算法,就可以得出inode节点号。
参考文章:
https://blog.csdn.net/u013485792/article/details/50764224 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值