我已经开始阅读Linux上IPC机制之一的消息队列。但是,第一步我有一些非常基本的问题。


使用ftok()生成唯一ID(密钥)以及要生成的唯一ID。
我们不能使用简单的数字来获取密钥而不是使用ftok()吗?
key函数中的参数msget的目的是什么?

#include "sys/msg.h"
key = ftok("/home/beej/somefile", 'b');
msqid = msgget(key, 0666 | IPC_CREAT);

msqidkey有什么区别?

最佳答案

ftok函数创建一种要与System V IPC函数一起使用的标识符(semgetshmgetmsgget)。可以将其视为文件描述符:打开文件时,将路径传递到open并获取一个返回的数字,然后将该数字用于readwrite来标识文件。 ftok函数的作用类似,但是文件描述符的作用域仅限于称为open(及其子级)的进程,而ftok令牌在整个系统中均有效。

系统范围的原因是您希望两个或多个独立的进程可以访问相同的IPC资源。因此,如果您有两个都执行key = ftok("/home/beej/somefile", 'b');的程序,那么两个程序都将获得相同的令牌并可以访问相同的资源(信号量,共享内存,消息队列)。这就是过程间通信的重点。

您不能仅使用“简单数字”,因为您不知道令牌可能是例如系统内部表的索引还是其他内容。换句话说,您不知道该令牌在内部如何使用,因此您确实需要使用ftok

手册页说:“指定的路径必须指定调用过程可以访问的现有文件,否则调用将失败。此外,请注意,指向文件的链接将在给定相同ID的情况下返回相同的密钥。”由此,我假设至少有一些ftok实现通过查找path指定的文件的索引节点号来创建令牌,并将其与第二个参数组合以创建令牌。第二个参数简单存在,因此您可以创建一堆IPC资源(例如用于保护不同资源的多个信号灯)。

至于key_tftok返回的值)和msgget保留的值的区别:前者使您可以访问大量IPC资源(信号量,共享内存和消息队列),而后者标识特定的消息队列。

关于c - 消息队列中的目的ftok是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15840897/

10-12 13:30