基于ftok()函数唯一键值

最近弄一个项目,需要用到共享内存和消息队列等,唯一键值是一个大问题,linux下提供了ftok函数,为了项目的健壮性,阅读了《ftok()函数深度解析》, 根据博主的分析,真的存在一个需要解决的陷阱。

  • ftok获取的键值是由ftok()函数的第二个参数的后8个bit,st_dev的后两位,st_ino的后四位构成的。
  • 要确保key值不变,要么确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值。

但是在生产环境下

  • 使用ftok访问一个公共目录下的文件获取唯一文件id,可以产生不易冲突的键值,但是用户行为等不可预料的文件操作可能造成的不可预料的结果。
  • 使用固定键值,可能存在键值不唯一性,或者与其他项目冲突,产生不可预料的结果。

为了防止项目的出现不可预料的情况,必须得想办法解决。

  1. 在项目的每个共享程序中都加入文件检测,只要文件状态出现变化或者文件被删除,都对 ftok得到的键值进行一次维护。
  2. 创建一个共享管理程序,当该文件件出现变化时,对该文件进行一次维护,并进行全局广播,全局状态更新一次。
  3. 在创建共享队列id的绑定文件中保存唯一id,当文件被删除或者被修改,共享管理程序对该文件进行纠正和相关维护。

上面几种方法,都可以借鉴,当我认为如果一个程序能够完成的事情,就不要所有程序都要做,虽然对并发有好处,但是频繁的调用文件IO本身就是影响程序性能的一件事情
所以不推荐使用第一种方案。


如果大家有啥想法,欢迎留言交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值