我已经开始阅读Linux上IPC机制之一的消息队列。但是,第一步我有一些非常基本的问题。
使用ftok()
生成唯一ID(密钥)以及要生成的唯一ID。
我们不能使用简单的数字来获取密钥而不是使用ftok()
吗?key
函数中的参数msget
的目的是什么?
#include "sys/msg.h"
key = ftok("/home/beej/somefile", 'b');
msqid = msgget(key, 0666 | IPC_CREAT);
msqid
和key
有什么区别? 最佳答案
ftok
函数创建一种要与System V IPC函数一起使用的标识符(semget
,shmget
,msgget
)。可以将其视为文件描述符:打开文件时,将路径传递到open
并获取一个返回的数字,然后将该数字用于read
和write
来标识文件。 ftok
函数的作用类似,但是文件描述符的作用域仅限于称为open
(及其子级)的进程,而ftok
令牌在整个系统中均有效。
系统范围的原因是您希望两个或多个独立的进程可以访问相同的IPC资源。因此,如果您有两个都执行key = ftok("/home/beej/somefile", 'b');
的程序,那么两个程序都将获得相同的令牌并可以访问相同的资源(信号量,共享内存,消息队列)。这就是过程间通信的重点。
您不能仅使用“简单数字”,因为您不知道令牌可能是例如系统内部表的索引还是其他内容。换句话说,您不知道该令牌在内部如何使用,因此您确实需要使用ftok
。
手册页说:“指定的路径必须指定调用过程可以访问的现有文件,否则调用将失败。此外,请注意,指向文件的链接将在给定相同ID的情况下返回相同的密钥。”由此,我假设至少有一些ftok
实现通过查找path指定的文件的索引节点号来创建令牌,并将其与第二个参数组合以创建令牌。第二个参数简单存在,因此您可以创建一堆IPC资源(例如用于保护不同资源的多个信号灯)。
至于key_t
(ftok
返回的值)和msgget
保留的值的区别:前者使您可以访问大量IPC资源(信号量,共享内存和消息队列),而后者标识特定的消息队列。
关于c - 消息队列中的目的ftok是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15840897/