c++ - 拒绝从非 fork 进程访问共享内存

标签 c++ c linux shared-memory

我需要创建一个包含一些 secret 数据的共享内存段。我使用 shmgetshmat 函数访问具有 0600 权限的段。我只想与 fork 进程共享这段内存。我尝试创建另一个应用程序来尝试访问该段,但没有成功,所以它看起来像我想要的那样工作。

但是当我再次运行创建段的应用程序时,它可以访问该段。这怎么可能?将 secret 数据存储到共享内存中是个好主意吗?

最佳答案

您可以 mmap()通过在父进程中提供 MAP_SHAREDMAP_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/

相关文章:

python - python 查找重复行

linux - 无法通过 jenkins 打开 Chrome 浏览器 --- 未知错误 : Chrome failed to start: crashed

java - 如何将另一个文件中的类包含到您的主文件中

c++ - 函数指针位移

c - 我不明白为什么限定符 static 在这里应用于 x?

将字符串转换为十六进制

c - 文件正在无限接受输入

C++ BST 内存错误 - 我的删除有什么问题?

c++ - 用于简单记录器的 << 运算符的可变参数模板

linux - 如何查询特定邻居的 IPv6 NDP(邻居发现协议(protocol))表