关于linux下ftok创建key的问题
项目场景:
在多线程中使用信号量时需要先根据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的问题相关推荐
- linux 杂项设备,Linux下自动创建节点的字符杂项设备 misc_register
Linux下自动创建节点的字符杂项设备 misc_register admin • 2020 年 01 月 07 日 杂项设备 Linux里面的misc杂项设备是主设备号为10的驱动设备 定义头文件: ...
- linux下怎么创建root,Linux用root账号创建一个新的登录账号的方法
Linux下如何创建新用户通常情况下,处于安全考虑,一般都给自己创建一个普通用户,而不直接使用root用户,因为权限大了,误操作就容易带来无法弥补的损失.Linux系统中,只有root用户有创建其他用 ...
- Linux下SVN创建新的项目
Linux下SVN创建新的项目 Linux环境下的SVN创建新的项目 一.前置条件: 1)有安装了linux系统的服务器,123.*.*.29 2)服务器上安装了svn,本人服务器的svn的数据安装的 ...
- Linux下Netfilter创建自己的Hook,让数据包可以发送到用户层,然后统计节点负载信息
Linux下Netfilter创建自己的Hook函数,让数据包可以发送到用户层,然后统计节点的负载信息 写在最前面,我的linux内核版本是4.4.0-31-generic,版本是Ubuntu 16. ...
- 如何创建一个linux用户名和密码,Linux下如何创建用户 | Soo Smart!
Linux下如何创建用户? 初步接触linux时要学会用户账号的添加.删除与修改.用户口令的管理.用户组的管理方法,这里列出来供大家参考使用吧. user的create, delete, modify ...
- linux批量创建用户1000,Linux下批量创建用户
Linux下批量创建用户主要有以下两种方法: 方法一: 1,新建一个文件user.txt,以/etc/passwd 为模板 2,再次新建一个文件passwd..txt,以/etc/shadow 为模板 ...
- linux如何创建目录结构,linux下怎么创建一个目录命令mkdir
linux下怎么创建一个目录命令mkdir linux下用mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: ...
- Linux下如何创建loop device
在Linux中,有一种特殊的块设备叫loop device,这种loop device设备是通过影射操作系统上的正常的文件而形成的虚拟块设备 .因为这种设备的存在,就为我们提供了一种创建一个存在于其他 ...
- linux下文件系统创建
linux下文件系统的创建管理: linux文件系统按照日志类型分为非日志和日志型 日志型文件系统:ext3,ext4,xfs 非日志文件系统:ext2 linux文件系统存储分为元数据区和索引区,每 ...
最新文章
- 一个class运用promise的延时调用
- mnist 数据集的识别源码解析
- PHP随机数:mt_rand更快
- 汇编语言学习笔记-按指定的字体输出文本
- 第三次学JAVA再学不好就吃翔(part88)--ArrayList嵌套ArrayList
- Hibernate:组合模式解决树的映射
- 妙用世界之窗浏览器的隐私保护功能
- 混合模型简介与高斯混合模型
- SpringBoot 集成 Jsp、Thymeleaf 模板引擎 + Thymeleaf 基本使用
- 24. 使用GitHub
- Java的线程在哪个地方执行,Java多线程
- 四元数和旋转_使用OpenCV的四元数
- 简单理解数据库游标cursor
- python之dataframe写excel合并单元格_python之DataFrame实现excel合并单元格
- RTP 将h264流封装成ps流并发送(C语言代码)
- vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
- js直接调用系统打印机进行打印
- 解决迅雷极速版强制升级-20190715
- 基于令牌的服务器访问验证失败
- 自助微信公众号客服提醒功能开发的实现