我正在使用shmget在Linux上的项目进程之间共享数据。
int shmget(key_t key, size_t size, int shmflg);
但是,任何其他程序也可以调用shmget,因此它可能导致键冲突(因为我使用常量作为调用shmget的键,我必须使用常量而不是生成的键,因为横向进程是建造并单独运行。)
在shmget中用作键的安全值应该是什么?
答案 0 :(得分:6)
没有安全值,您(以及创建共享段的所有其他进程)应使用IPC_EXCL
来确保没有冲突。但是,后者应确保其他程序不会开始写入您的细分(除非它们写得很糟糕)。
你可以尝试在'{3}}之外建立'私人'密钥,但是,你知道它不安全。如果您遇到某些问题,您将无法告诉您的程序这不是正确的密钥。还要记住:
只有
id
的低阶8位才有意义。如果这些位为0,则不指定ftok()的行为。
换句话说,不要在那里传递0
。)。
无论如何,您应该认真考虑创建一些沟通渠道。服务器用id写的单个文件就足够了,然后由其他程序读取。
从其他想法,您可以尝试将服务器PID作为id
传递,如果其他进程至少可以获得。这可能会让它更“安全”。
答案 1 :(得分:5)
我建议您使用POSIX shm_open
(使用mmap
)代替,只要您没有使用ftok
,它就不存在与{{1}}存在冲突的问题与其他软件相同的命名区域。