项目场景:在多线程中使用信号时,必须首先基于key在semget中创建信号,但key的创建通常由系统ftok完成。 (当然,在此指定密钥被认为不安全。)
问题说明:测试中发现一种异常情况,信号量增加超过系统限制,后续信号量创建失败,引起其他明显错误。
原因分析:打印ftok创建的密钥值发现异常时,引起密钥值的变化。
我们先来看看ftok函数:
# includesys/types.h # includesys/IPC.HKEY _ tft ok (const char * pathname,int proj_id ); 这里不得不说是ftok的陷阱。 可见key是与pathname和id共同制作的。 怪不得如果path那么一样,key一定会一样吗?
这里令人误解的是,只要文件的路径、名称和子序列号不变,得到的密钥值就永远不变。 相反,如果是位于文件路径删除重建之后的key值会变,实验表明pathname不仅作为参数,而且在ftok函数内部引用了文件的属性这里在多线程中就会引发不可预料的错误。
解决方案:确保key的值不变。
1、ftok ) )的文件,或者不删除(ftok ) )而指定固定的密钥值,以防止ftok导致异常场景。
2、不要参考系统自动生成的文件,自己动态生成文件。 由此,能够避免由几个操作参照的系统内的文件发生变化(重新创建、删除、复盖等),参照自己动态创建的文件是最安全的,自己控制文件的操作(创建、删除、复盖等)