如何保护Linux中进程之间共享的内存

问题描述:

在Linux或其他现代操作系统中,每个进程的内存都受到保护,因此在一个进程中进行疯狂写入不会导致其他进程崩溃。现在假设,我们在进程A和进程B之间共享内存。现在说,由于软错误,进程A无意中将某些内容写入该内存区域。考虑到进程A和进程B都具有对该内存的完全写入权限,是否有任何方法可以保护这一点?如何保护Linux中进程之间共享的内存

当您致电shm_open时,您可以将O_RDONLY标志传递给模式参数。

或者,您可以使用mprotect将特定页面标记为(例如)只读。你需要两个进程之间的合作和信任才能做到这一点,B没有办法说A不能使用mprotect来写入它。

如果您确实想确定其他进程无法干涉,那么通过管道或套接字进行一些描述通信可能是一个明智的想法。

您还可以使用mmap来映射某些内容(例如在/dev/shm?中),如果两个进程之一作为单独的UID运行,则文件权限将无法写入。例如,如果用户生产者和组使用者拥有/dev/shm/myprocess,并且在将映射文件权限设置为0640之前,使用该UID和GID运行进程,则可以防止第二个进程写入该进程。

+0

我知道mprotect,但正如我所说的,它们都具有完全的读写访问权限。对我来说,实现这一点似乎是不可能的,我认为可靠性是共享存储系统的一个主要问题。不是吗? – MetallicPriest

+1

@MetallicPriest更新为公开呼叫添加'O_RDONLY'标志。但也有其他解决方案。我会尽快更新。 – Flexo

+0

谢谢awoodland。我想到的一个解决方案是每次访问共享内存时都使用一个互斥锁,并且只有在锁定了互斥锁时才给该进程写入访问权限。这将减少野外写入的机会。但是,当共享内存访问频率很高时,我认为这种方案效率很低。 – MetallicPriest

您可以在每次写入时使用简单的校验和。因此,当一个进程在读取操作时检测到错误的校验和时,这是其他进程失败的标志。

+0

您可以使用校验和,但也要考虑使用信号量,因为如果没有某种形式的同步,校验和本身就是一个糟糕的解决方案。但是你真正想要确定的最好的解决方案是让一个主机写入并读取该内存并通过套接字与它进行通信,以便验证每次写入。 – Martin