在shmget中用作键的安全值

时间:2012-08-27 06:41:26

标签: c++ linux key shared-memory

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

你可以尝试在'{3}}之外建立'私人'密钥,但是,你知道它不安全。如果您遇到某些问题,您将无法告诉您的程序这不是正确的密钥。还要记住:

  

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

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

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

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

答案 1 :(得分:5)

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