dev*_*ium 13 c unix shared-memory ftok
使用共享内存时,我们为什么要关心创建密钥
key_t ftok(const char *path, int id);
Run Code Online (Sandbox Code Playgroud)
在下面的代码中?
key_t key;
int shmid;
key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,访问给定共享内存所需的是shmid,而不是密钥.还是我错了?如果我们需要的是shmid,每次不仅仅创建一个随机密钥有什么意义呢?
@ Beej的Unix IPC指南可以阅读:
那
key废话怎么样?我们如何创建一个?好吧,因为类型key_t实际上只是一个long,你可以使用你想要的任何数字.但是如果你硬编码数字和其他一些不相关的程序硬编码相同的数字但想要另一个队列呢?解决方案是使用ftok()从两个参数生成密钥的函数.
读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?
R..*_*R.. 13
整个System V IPC系统充满了这样糟糕的设计.(通过糟糕的设计,我的意思是共享资源的一个小命名空间,你必须依赖于愚蠢的技巧,比如ftok获取密钥并祈祷它不会与使用中的任何其他密钥发生冲突.)
如果可能的话,我会假装它不存在并且尽可能使用POSIX共享内存(同样POSIX线程同步原语代替System V信号量).我能想到的唯一一个需要System V共享内存的实例是X共享内存映像扩展和其他X扩展.
编辑:为了更好地回答OP关于目的的问题ftok:key_t通常是32位,是的,你可以自己选择一个32位数字,但问题是人类不太可能选择所有数字,并且碰撞的可能性太高了.ftok允许您选择一个文件(旨在成为您的应用程序的唯一文件)和一个整数,并使用您选择的整数散列文件的inode编号,这样可以在密钥空间中更均匀地分配密钥选项.当然rand,只要您有办法将结果传递给需要附加共享内存的其他进程,您也可以选择一个密钥.
Tob*_*oby 11
是的,您需要使用shmid在使用shmat()后打开共享内存(使用)shmget().但是您要访问的特定共享内存块是基于您正在使用的密钥,即希望通过shm进行通信的不同进程将需要使用相同的密钥.如果您只是使用随机数作为键,则可能会与其他一些不相关的程序发生冲突.
我打算建议看看Beej的IPC指南,但我发现你已经找到了它:)