我已经开始阅读Linux上IPC机制之一的消息队列,但在第一步,我有一些非常基本的问题。
使用ftok()
生成唯一id(key)和要生成的唯一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
函数也有类似的用途,但是尽管filedescriptor的作用域仅限于调用open
的进程(及其子进程),但ftok
令牌在整个系统中都是有效的。
系统作用域的原因是您希望两个或多个独立进程能够访问相同的ipc资源。因此,如果您有两个程序,它们都执行key = ftok("/home/beej/somefile", 'b');
,那么它们都将获得相同的令牌,并因此可以访问相同的资源(信号量、共享内存、消息队列)。这就是进程间通信的全部要点。
您不能只使用“简单数字”,因为您不知道标记可能是系统内部表的索引或其他内容。换句话说,您不知道如何在内部使用该令牌,因此您确实需要使用ftok
。
man页面说:“指定的路径必须指定一个现有的文件,该文件是调用进程可访问的,否则调用将失败。另外,请注意,如果给定相同的id,指向文件的链接将返回相同的密钥。“由此,我假设至少有一些ftok
实现通过查找path指定的文件的inode号来创建令牌,并将其与第二个参数组合以创建令牌。第二个参数简单地存在,这样您就可以创建一堆IPC资源(像几个信号灯来保护不同的资源)。
至于key_t
(由ftok
返回的值)和由msgget
返回的值的区别:前者允许您访问一组ipc资源(信号量、共享内存和消息队列),而后者标识一个特定的消息队列。
关于c - 消息队列中的目的ftok是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7358400/