在上一篇文章中,Mayuyu讲述了共享内存的原理以及使用方法。在创建共享内存之前,必须指定一个ID值,而这个ID值通常是通过现在要讲的ftok()函数得到。ftok()函数原型如下

其中参数fname是指定的文件名,这个文件必须是存在的而且可以访问的。id是子序号,它是一个8bit的整数。即范围是0~255

当函数执行成功,则会返回key_t键值,否则返回-1。在一般的UNIX中,通常是将文件的索引节点取出,然后在前面加上子序号就得到key_t的值。查看文件索引节点号的方法是使用命令:ls -i。例如,指定文件为share,索引号为787706,对应16进制为0xc04fa,如图

子序号设置为0,那么得到key值为0x000204fa,如下图

在上篇文章中,shmget()函数的参数key就是通过这种方式生成的。另外说明一下,在shmget()函数中的key,还可以用IPC_PRIVATE0,这样会建立新共享内存对象。

关于ftok()函数的一个陷阱

在使用ftok()函数时,里面有两个参数,即fnameidfname为指定的文件名,而id为子序列号,这个函数的返回值就是key,它与指定的文件的索引节点号和子序列号id有关,这样就会给我们一个误解,即只要文件的路径,名称和子序列号不变,那么得到的key值永远就不会变。

事实上,这种认识是错误的,想想一下,假如存在这样一种情况:在访问同一共享内存的多个进程先后调用ftok()时间段中,如果fname指向的文件或者目录被删除而且又重新创建,那么文件系统会赋予这个同名文件新的i节点信息,于是这些进程调用的ftok()都能正常返回,但键值key却不一定相同了。由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目 的将无法实现。

这是一个很重要的问题,希望能谨记!!!

所以要确保key值不变,要么确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值。

ftok()函数的使用相关推荐

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

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

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

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

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

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

  4. key_t键和ftok函数(转)

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

  5. linux ftok函数

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

  6. linux C -- ftok函数

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

  7. ftok函数的作用:

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

  8. key_t键和ftok函数

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

  9. 【IPC通信】key_t键和ftok函数

    System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用key_t值做为它们的名字.key_t这个数据类型在<sy ...

最新文章

  1. LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法
  2. [转]搞ACM的你伤不起(转自Roba大神)
  3. Robotium测试没有源码的apk--需重签名apk
  4. 多线程执行CPU过高问题
  5. Python数据分析:pandas玩转Excel(二)
  6. 1321:棋盘问题(深度优先搜索进阶)
  7. thinkphp 文件下载实例 实现以及注意事项
  8. Linux curl命令详解
  9. STC8G七彩数字时钟、GPIO设置、DS1302使用、热敏电阻测温、SM5166P和MBI5024控制数码管显示
  10. IEC 60529防护等级的定义
  11. iframe透明背景
  12. 计算机音乐有哪些优势,谈谈用电脑听无损音乐的好处
  13. 一文读懂 HBase 使用场景
  14. LNK1181 无法打开输入文件“winmm.lib”
  15. AGV、IGV、RGV这三者之间的区别浅析
  16. 不撞南墙不回头——树形动态规划(树规)
  17. 一位高三老师写给大学生的信
  18. 真人口播视频号:流量不愁,变现才是重中之重丨国仁网络
  19. 微习惯--简单到四个
  20. 关于旋转矩阵的左乘与右乘问题

热门文章

  1. Exception in thread “main“ java.time.DateTimeException: Unable to extract ZoneId from temporal
  2. 网络安全笔记 -- 逻辑越权(水平垂直越权)
  3. java ip 获取了两个_用Java获取本地的多个IP地址
  4. 新增订单统计信息 (20 分)
  5. 卸载k8s和docker
  6. Mac安装brew(2020年踩过无数坑后亲测有效的方法)
  7. VMware卸载不干净导致无法重安
  8. layui解决数据表格右侧有空白现象
  9. 植物大战僵尸:寻找葵花生产速度
  10. matlab小波分析信号消除噪声函数,小波分析的语音信号噪声消除方法