最近弄一个项目,需要用到共享内存和消息队列等,唯一键值是一个大问题,linux下提供了ftok函数,为了项目的健壮性,阅读了《ftok()函数深度解析》, 根据博主的分析,真的存在一个需要解决的陷阱。
- ftok获取的键值是由ftok()函数的第二个参数的后8个bit,st_dev的后两位,st_ino的后四位构成的。
- 要确保key值不变,要么确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值。
但是在生产环境下
- 使用ftok访问一个公共目录下的文件获取唯一文件id,可以产生不易冲突的键值,但是用户行为等不可预料的文件操作可能造成的不可预料的结果。
- 使用固定键值,可能存在键值不唯一性,或者与其他项目冲突,产生不可预料的结果。
为了防止项目的出现不可预料的情况,必须得想办法解决。
- 在项目的每个共享程序中都加入文件检测,只要文件状态出现变化或者文件被删除,都对 ftok得到的键值进行一次维护。
- 创建一个共享管理程序,当该文件件出现变化时,对该文件进行一次维护,并进行全局广播,全局状态更新一次。
- 在创建共享队列id的绑定文件中保存唯一id,当文件被删除或者被修改,共享管理程序对该文件进行纠正和相关维护。
上面几种方法,都可以借鉴,当我认为如果一个程序能够完成的事情,就不要所有程序都要做,虽然对并发有好处,但是频繁的调用文件IO本身就是影响程序性能的一件事情
所以不推荐使用第一种方案。
如果大家有啥想法,欢迎留言交流。