C++ shmget中用作键的安全值
我正在使用shmget在Linux上的项目进程之间共享数据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以确保没有冲突。但是,后者应该确保其他程序不会开始写入您的
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()使用randomid
。如果您有一个客户机-服务器场景,其中每个客户机维护一个共享内存段,以便与服务器进行高效的IPC,uniqueshmget()
键的一个不错的选择是基于getId()
系统调用,该调用返回调用方的线程id。不过,这是Linux特有的。