我需要创建一个包含一些 secret 数据的共享内存段。我使用 shmget
和 shmat
函数访问具有 0600 权限的段。我只想与 fork 进程共享这段内存。我尝试创建另一个应用程序来尝试访问该段,但没有成功,所以它看起来像我想要的那样工作。
但是当我再次运行创建段的应用程序时,它可以访问该段。这怎么可能?将 secret 数据存储到共享内存中是个好主意吗?
最佳答案
您可以 mmap()
通过在父进程中提供 MAP_SHARED
和 MAP_ANONYMOUS
标志来共享和匿名内存区域。该内存只能由该进程及其子进程访问。由于内存段是匿名的,没有其他进程可以引用它,更不用说访问/映射它了:
void *shared_mem = mmap(NULL, n_bytes, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
父进程应该使用mmap()
创建共享内存段。该内存段由 fork()
创建的任何子进程继承。子进程可以简单地使用从父进程继承的 shared_mem
指针来引用该内存段:
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
void *shared_mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
pid_t pid = fork();
if (pid > 0) {
// parent
// use shared_mem here
} else if (pid == 0) {
// child
// use shared_mem here
} else {
// error
}
return 0;
}
关于c++ - 拒绝从非 fork 进程访问共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738357/