在shmget中用作键的安全值

jon*_*ham 6 c++ linux key shared-memory

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

int shmget(key_t key, size_t size, int shmflg);
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*rny 6

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

您可以尝试在ftok()之外构建"私有"密钥,但是,您知道它不安全.如果您遇到某些问题,您将无法告诉您的程序这不是正确的密钥.还要记住:

只有低阶8位id才有意义.如果这些位为0,则不指定ftok()的行为.

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

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

从其他想法,您可以尝试传递服务器PID id,如果其他进程至少可以获得.这可能会让它更"安全".


Has*_*kun 5

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