该ftok
函数创建一种标识符,用于 System V IPC 函数 ( semget
, shmget
, msgget
)。把它想象成一个文件描述符:当你打开一个文件时,你传递一个路径并得到一个数字作为回报,然后open
用于识别文件。该函数具有类似的目的,但是虽然文件描述符的范围仅限于调用的进程(及其子进程),但令牌在整个系统中都是有效的。read
write
ftok
open
ftok
系统范围的原因是您希望两个或多个独立进程能够访问相同的 IPC 资源。因此,如果您有两个程序,都执行key = ftok("/home/beej/somefile", 'b');
,两者都将获得相同的令牌,因此可以访问相同的资源(信号量、共享内存、消息队列)。这就是进程间通信的全部意义所在。
您不能只使用“简单数字”,因为您不知道令牌是否可能是例如系统内部表的索引或其他东西。换句话说,您不知道该令牌在内部是如何使用的,因此您确实需要使用ftok
.
手册页说:“指定的路径必须指定调用进程可以访问的现有文件,否则调用将失败。另外,请注意,文件链接将返回相同的键,给定相同的 id。” 据此,我假设至少有一些ftok
实现通过查找path指定的文件的 inode 号并将其与第二个参数组合来创建令牌来创建令牌。第二个参数的存在很简单,因此您可以创建一堆 IPC 资源(例如多个信号量来保护不同的资源)。
至于key_t
(返回的值ftok
)和返回的值的区别msgget
:前者让你访问一堆IPC资源(信号量、共享内存和消息队列),而后者标识一个特定的消息队列。