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

C Linux中如何保护进程间共享的内存,c,linux,memory,C,Linux,Memory,在Linux或其他现代操作系统中,每个进程的内存都受到保护,因此一个进程中的任意写入不会使任何其他进程崩溃。现在假设进程A和进程B之间共享了内存。现在假设,由于一个软错误,进程A无意中将某些内容写入该内存区域。如果进程A和进程B都具有对该内存的完全写访问权限,是否有任何方法可以保护该内存。调用时,可以将O_RDONLY标志传递给模式参数 或者,您可以使用将特定页面标记为(例如)只读。要做到这一点,您需要两个进程之间的合作和信任,B无法说A不能使用mprotect对其进行写入 如果您确实希望确保其

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

调用时,可以将
O_RDONLY
标志传递给模式参数

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

如果您确实希望确保其他进程不会干扰,那么通过某种描述的管道或套接字进行通信可能是一个明智的想法


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

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

我知道mprotect,但正如我所说,两者都具有完全的读写访问权限。在我看来,这是不可能实现的,我认为可靠性是共享内存系统的一个主要问题。是吗?@metallicprest更新为open调用添加了
O_RDONLY
标志。不过,还有其他解决方案。我很快会再更新的。谢谢阿伍德兰德。我想到的一个解决方案是,每次访问共享内存时都使用互斥体,只有当进程锁定互斥体时,才授予进程写访问权。这将减少疯狂写作的机会。但是,我认为当共享内存访问频率很高时,此方案的效率会非常低。@MetallicPrist,如果您有错误的指针,互斥锁本身可能会损坏…直接更改
/dev/shm
中“文件”的权限是不可移植的。相反,在使用
shm_open
O_create
创建共享内存对象时,应该指定所需的模式(权限)。或者,只需在普通文件系统中使用一个文件,而不是<代码> SmithOpOpen//Cord>获得共享内存。您可以使用校验和,但也可以考虑使用信号量,因为单独使用校验和将是一种可怕的解决方案而不需要某种形式的同步。但是,您真正想要确保的最佳解决方案是使用一个主机来写入和读取内存,并通过套接字与之通信,以便它能够验证每次写入。