C++ shmget中用作键的安全值

C++ shmget中用作键的安全值,c++,linux,key,shared-memory,C++,Linux,Key,Shared Memory,我正在使用shmget在Linux上的项目进程之间共享数据 int shmget(key_t key, size_t size, int shmflg); 但是,任何其他程序也可以调用shmget,因此可能会导致密钥冲突(因为我使用常量作为调用shmget的密钥,我必须使用常量而不是生成的密钥,因为横向进程是单独构建和运行的) shmget中用作键的安全值应该是什么?没有安全值,您(以及创建共享段的每个其他进程)应该使用IPC_EXCL以确保没有冲突。但是,后者应该确保其他程序不会开始写入您的

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

int shmget(key_t key, size_t size, int shmflg);
但是,任何其他程序也可以调用shmget,因此可能会导致密钥冲突(因为我使用常量作为调用shmget的密钥,我必须使用常量而不是生成的密钥,因为横向进程是单独构建和运行的)


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

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

您可以尝试构建“私钥”常量,但您知道这不安全。如果与某个对象发生冲突,您将无法告诉程序这不是正确的键。还要记住:

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

换句话说,不要在那里传递
0
0;)

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


根据其他想法,您可以尝试将服务器PID作为
id
传递,前提是其他进程至少可以这样做。这可能会使它更“安全”。

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

我正在考虑生成随机密钥,重复使用IPC_EXCL标志创建shm段,直到找到一个可接受的密钥,但我不知道这是否是一个好的密钥option@PaulDinh:是的,那是一个很好的选择。好吧,但是你必须有一种生成随机密钥的方法,而不依赖于特定的
sizeof(key_t)
;然后,我会对ftok()使用random
id
。如果您有一个客户机-服务器场景,其中每个客户机维护一个共享内存段,以便与服务器进行高效的IPC,unique
shmget()
键的一个不错的选择是基于
getId()
系统调用,该调用返回调用方的线程id。不过,这是Linux特有的。