6

我正在使用 shmget 在 Linux 上的项目进程之间共享数据。

int shmget(key_t key, size_t size, int shmflg);

但是,任何其他程序也可以调用 shmget,因此可能会导致密钥冲突(因为我使用常量作为调用 shmget 的密钥,所以我必须使用常量而不是生成的密钥,因为横向进程是构建并运行的分别地)。

在 shmget 中用作键的安全值应该是什么?

4

2 回答 2

6

没有安全值,您(以及创建共享段的所有其他进程)应该使用IPC_EXCL以确保没有冲突。但是,后者应确保其他程序不会开始写入您的段(除非它们写得不好)。

您可以尝试在ftok()之外构建您的“私有”密钥常量,但是您知道它不安全。如果您与某物发生碰撞,您将无法告诉您的程序这不是正确的键。还要记住:

只有低 8 位id是有效的。如果这些位为 0,则未指定 ftok() 的行为。

换句话说,不要通过0那里;)。

无论如何,您应该认真考虑创建一些沟通渠道。服务器用 id 写入的单个文件就足够了,然后其他程序将读取该文件。

从其他想法来看,您可以尝试将服务器 PID 传递为id,如果其他进程至少可以得到它。这可以使它更“安全”一些。

于 2012-08-27T07:03:13.850 回答
5

我建议您改用 POSIX shm_open(with ),只要您不使用与其他软件相同的命名区域mmap,它就不存在存在冲突的问题。ftok

于 2012-08-27T08:58:49.893 回答