项目场景:

在多线程中使用信号量时需要先根据key去semget创建信号量,而key的创建一般则是由系统ftok给出,(当然可以指定,指定key在这里认为不安全)。


问题描述:

在测试时,发现一种异常情况,信号量递增超出系统限制,导致后续创建信号量失败,引发了其他显式的错误。


原因分析:

将ftok创建的key值打印发现异常情况引起key值的变化。
首先查看ftok函数:

 #include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);

这里不得不说ftok的一个陷阱了:

可见key是通过pathname和id共同创建的,按道理说path那么相同那么key一定就会相同吗?
这里就会给我们一个误解,即只要文件的路径,名称和子序列号不变,那么得到的key值永远就不会变。其实不是这样的,通过实验发现,如果这个文件路径删除重建之后的key值会变,那么就是说pathname不仅仅只是作为参数,而在ftok函数内部引用了文件的属性。
这里在多线程中就会引发不可预料的错误。


解决方案:

确保key值不变。
1、确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值,防止ftok引发异常场景。
2、自己动态创建文件,不要引用系统中自动创建的文件。这样就可以避免一些操作导致引用的系统中的文件变化(重新创建、删除、覆盖等情况),引用由自己动态创建的文件最安全,自己完全可以限制文件的操作(创建、删除、覆盖等操作)。

关于linux下ftok创建key的问题相关推荐

  1. linux 杂项设备,Linux下自动创建节点的字符杂项设备 misc_register

    Linux下自动创建节点的字符杂项设备 misc_register admin • 2020 年 01 月 07 日 杂项设备 Linux里面的misc杂项设备是主设备号为10的驱动设备 定义头文件: ...

  2. linux下怎么创建root,Linux用root账号创建一个新的登录账号的方法

    Linux下如何创建新用户通常情况下,处于安全考虑,一般都给自己创建一个普通用户,而不直接使用root用户,因为权限大了,误操作就容易带来无法弥补的损失.Linux系统中,只有root用户有创建其他用 ...

  3. Linux下SVN创建新的项目

    Linux下SVN创建新的项目 Linux环境下的SVN创建新的项目 一.前置条件: 1)有安装了linux系统的服务器,123.*.*.29 2)服务器上安装了svn,本人服务器的svn的数据安装的 ...

  4. Linux下Netfilter创建自己的Hook,让数据包可以发送到用户层,然后统计节点负载信息

    Linux下Netfilter创建自己的Hook函数,让数据包可以发送到用户层,然后统计节点的负载信息 写在最前面,我的linux内核版本是4.4.0-31-generic,版本是Ubuntu 16. ...

  5. 如何创建一个linux用户名和密码,Linux下如何创建用户 | Soo Smart!

    Linux下如何创建用户? 初步接触linux时要学会用户账号的添加.删除与修改.用户口令的管理.用户组的管理方法,这里列出来供大家参考使用吧. user的create, delete, modify ...

  6. linux批量创建用户1000,Linux下批量创建用户

    Linux下批量创建用户主要有以下两种方法: 方法一: 1,新建一个文件user.txt,以/etc/passwd 为模板 2,再次新建一个文件passwd..txt,以/etc/shadow 为模板 ...

  7. linux如何创建目录结构,linux下怎么创建一个目录命令mkdir

    linux下怎么创建一个目录命令mkdir linux下用mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: ...

  8. Linux下如何创建loop device

    在Linux中,有一种特殊的块设备叫loop device,这种loop device设备是通过影射操作系统上的正常的文件而形成的虚拟块设备 .因为这种设备的存在,就为我们提供了一种创建一个存在于其他 ...

  9. linux下文件系统创建

    linux下文件系统的创建管理: linux文件系统按照日志类型分为非日志和日志型 日志型文件系统:ext3,ext4,xfs 非日志文件系统:ext2 linux文件系统存储分为元数据区和索引区,每 ...

最新文章

  1. 一个class运用promise的延时调用
  2. mnist 数据集的识别源码解析
  3. PHP随机数:mt_rand更快
  4. 汇编语言学习笔记-按指定的字体输出文本
  5. 第三次学JAVA再学不好就吃翔(part88)--ArrayList嵌套ArrayList
  6. Hibernate:组合模式解决树的映射
  7. 妙用世界之窗浏览器的隐私保护功能
  8. 混合模型简介与高斯混合模型
  9. SpringBoot 集成 Jsp、Thymeleaf 模板引擎 + Thymeleaf 基本使用
  10. 24. 使用GitHub
  11. Java的线程在哪个地方执行,Java多线程
  12. 四元数和旋转_使用OpenCV的四元数
  13. 简单理解数据库游标cursor
  14. python之dataframe写excel合并单元格_python之DataFrame实现excel合并单元格
  15. RTP 将h264流封装成ps流并发送(C语言代码)
  16. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
  17. js直接调用系统打印机进行打印
  18. 解决迅雷极速版强制升级-20190715
  19. 基于令牌的服务器访问验证失败
  20. 自助微信公众号客服提醒功能开发的实现

热门文章

  1. DNS server列表整理
  2. java主函数里调用子函数_java如何在函数中调用主函数的数组
  3. SPICE电路仿真(3)--二极管
  4. chorm浏览器安装油猴扩展
  5. mongodb distinct条件查询
  6. Fiddler常用操作
  7. HQL 多表联合查询
  8. Brian Tracy: Work Hard!(搜藏)
  9. 达梦查询一周内,一月内,一年内的数据
  10. Cocos2d-x 3.2 大富翁游戏项目开发-第二十部分 螃蟹挡路(code)