函数原型
 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节点号。
参考文章:
索引节点_百度百科 (baidu.com)
https://blog.csdn.net/u013485792/article/details/50764224 
(30条消息) linux   文件inode 详解_fuming0210sc的博客-CSDN博客
(30条消息) stat函数详解_星星紫炎的博客-CSDN博客_stat函数

ftok函数的key值是如何产生的相关推荐

  1. ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪

    在IPC中中,我们经常事情ftok函数来获取key,来作为获取消息队列id.共享存储标识和信号量ID.在项目中使用了php进程和linux进程通信,采用了消息队列的方式,但是结果表现为php中的fto ...

  2. Linux中ftok函数介绍

    函数原型: *key_t ftok(const char fname, int id); 功能:系统建立IPC通讯(如消息队列,共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到 ...

  3. ftok() 函数讲解 获取内核键值

    ftok() 函数之获取消息队列的键值 1.概述: 系统建立IPC通讯(消息队列.信号量和共享内存)时必须指定一个ID值,通常情况下,该ID值通过ftok函数得到. 2.原型: #include &l ...

  4. linux环境编程-- ftok()函数

    系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...

  5. key_t IPC键和ftok函数详解和剖析

    统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) fn ...

  6. key_t键和ftok函数(转)

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

  7. linux ftok函数

    系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...

  8. linux C -- ftok函数

    链接: linux C学习目录 原文链接:https://blog.csdn.net/u013485792/article/details/50764224 关于ftok函数,先不去了解它的作用来先说 ...

  9. key_t键和ftok函数

    目录 `key_t键`.`ftok函数` key_t键.ftok函数 key_t ftok(const char *pathname, int proj_id); 功能:通过ftok返回的是根据文件( ...

最新文章

  1. redissession有容量上限吗_空气炸锅值得买吗?
  2. while保留五位小数c语言,C语言教程(共同学习)
  3. 环球博览|中国六代机有望5年内问世
  4. uniapp自定义导航栏
  5. python好学嘛-爬虫Python入门好学吗?学什么?
  6. centos7 ifconfig命令找不到_分享一个解决 sudo 命令找不到环境变量的小技巧
  7. CSDN开播工具-嘉宾端使用说明
  8. 生成新的dataframe_Python之Pandas使用系列(九):DataFrame中列操作的技巧
  9. GitLab5.3修改项目仓库名称后wiki不能访问
  10. Java语言基础41-44--泛型与集合
  11. server2008r2经常蓝屏或者自动重启
  12. 天堂2经典服务端源代码ver2.0-2.7
  13. GPS开发----临近警告
  14. 【EXLIBRIS】纸版书目整理 -- 增补至2008年春节【36 种】【36 册】
  15. python报错跳过继续执行_python如何设置报错跳过
  16. 自来水管道铺设问题——数学建模
  17. 大数据为什么需要学python?
  18. 处理亚马逊差评的几个方法
  19. PHP MVC框架初探
  20. 2023年电工杯B题详解

热门文章

  1. 求你啦!配电室管理不要不会用工具
  2. python资源管理器 计算机项目下的_GitHub - wyh0655/ShowFoldersSize: 查看文件夹大小及文件结构...
  3. 丁磊口述:我是被逼才把网易做大的
  4. matplotlib中文乱码解决及plt.rcParams参数的使用
  5. ill-posed problem 以及 Tikhonov regularization
  6. 什么是 k8s OAM?
  7. JS上下自动漂浮广告,可关闭
  8. 计算机硬件的基本配置
  9. 金仓数据库KingbaseES用户口令管理与资源管理
  10. PRET-C:一种用于精确定时架构的编程新语言