|
发表于 2007-12-25 08:54:47
|
显示全部楼层
就是为了避免这种冲突, 所以一般这个 key 都不是随便写一个数字就好了的, 而是通过 ftok() 函数来产生, 它接受一个路径名和一个标志作为参数, 不同的文件名会产生不同的 key, 通过使用 ftok() 函数可以尽量避免冲突, 但是并不能完全避免冲突, 只是一种努力而已.
尽管冲突不可完全避免, 但是问题在于应该由谁来避免冲突. 确实, 开源软件种类丰富, 数量众多, 那么大家如何减少冲突呢? 编程人员应该尽量保证自己去避免与别人的冲突, 而不是反过来. 回到共享内在的问题来说, 便是不要定死使用一个确定的 key, 而是约定一种生成 key 的规则. 比如就用 ftok() 来生成 key. 如果我们这里假定由生产者来开辟共享内存, 而且它要使用 "/tmp/.abc001" 作为生成 key 的路径名, 但是它检测到此文件已经存在, 那么就试着使用 /tmp/.abc002 好了. 然后消费者呢? 它对于 /tmp/.abcxxx 的形式来说应该是可配置的, 但是它可以有一个默认的值, 比如 /tmp/.abc001.
想一想, 很多现实中的程序都是这样的, 不是么, 毕竟最有可能和自己产生冲突的恰恰就是自己的另一个进程. 以 qvfb 为例, 它以 /tmp/.qtvfb_mouse-N 作为路径开辟一块共享内存, N 从 0 开始计算. 这个文件名同时会被创建成一个有名管道, 如果有多个 qvfb 进程就产生多个这样的管道, 而当 qvfb 的某个进程退出时它会删除这一管道文件. 另一方面, 客户端程序只要让它去连接一个管道未被占用的 qvfb 就可以了, 并打开这个管道, 以确保别人无法再打开它. 这就是通过协商的方式来解决冲突.
个人拙见, 仅供参考
P.S. 昨天似乎网络比较差, 回复了半天都不成功, 有人遇到同样的问题么? |
|