gpt4 book ai didi

c - 仅与多个子进程之一共享内存?

转载 作者:行者123 更新时间:2023-12-03 09:51:23 26 4
gpt4 key购买 nike

我正在 Linux 上使用 C 开发一个应用程序,它管理多个沙盒环境,每个环境都在其自己的内核命名空间中。这些环境最终旨在尽可能地与系统的其余部分以及彼此之间隔离开来,但是仍然需要通过共享内存区域等方式与它们进行通信的能力。我目前通过 mmaping 与 MAP_SHAREDMAP_ANONYMOUS 共享内存来实现此功能,但当然这会授予所有 子进程可以访问我的应用程序的所有 共享内存。似乎没有一种简单/“内置”的方式来指定内存区域将与一个子进程共享(即不是 PRIVATE)但不是与所有子进程共享(即不是SHARED) 或者。

#define _GNU_SOURCE
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mount.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <sys/mman.h>

//Stack size for the containers
#define STACK_SIZE (1024 * 1024)

int *share;

//Two child processes that just read and print the shared state
int child1(void* arg){
for(int i=0;i<6;i++){
printf("Child 1 reads state as: %d.\n", *share);
sleep(1);
}
return 1;
}

int child2(void* arg){
for(int i=0;i<6;i++){
printf("Child 2 reads state as: %d.\n", *share);
sleep(1);
}
return 1;
}

int main(){
static char *stack_top;

//Map shared memory for the shared value - how do I share this with only one child process?
share = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*share = 0;

//Map memory for a stack for each child namespace and start them
stack_top = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
pid_t pid1 = clone(child1, stack_top + STACK_SIZE, CLONE_NEWNET | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWCGROUP | SIGCHLD, NULL);
stack_top = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
pid_t pid2 = clone(child2, stack_top + STACK_SIZE, CLONE_NEWNET | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWCGROUP | SIGCHLD, NULL);

//Wait, then change the state
sleep(3);
*share = 1;
printf("Changing state\n");

//Wait for both processes to return
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);

return 0;
}

这就是我目前的情况。显然,两个 child 都可以读取共享内存中的值。

Child 1 reads state as: 0.
Child 2 reads state as: 0.
Child 1 reads state as: 0.
Child 2 reads state as: 0.
Child 1 reads state as: 0.
Child 2 reads state as: 0.
Child 1 reads state as: 0.
Changing state
Child 2 reads state as: 1.
Child 1 reads state as: 1.
Child 2 reads state as: 1.
Child 1 reads state as: 1.
Child 2 reads state as: 1.

将共享内存访问限制为其中一个的最佳方法是什么?我可以想象也许每个沙箱使用一个受信任的子进程来完成它,但这看起来很老套而且过于复杂 - 当然有更好的方法来做到这一点吗?

最佳答案

我假设父进程想要​​与所有子进程对话,但每个子进程只应该“看到”父进程。

每个 child 需要一个 mmap 句柄。首先,创建尽可能多的句柄,你希望有 child 。然后,对于每个 child ,克隆,关闭所有句柄,但 fork 所针对的 child 的句柄除外(这会取消映射子进程的限制内存),然后留在进程中并运行子代码,或者执行子进程二进制,保留打开的句柄。

关于c - 仅与多个子进程之一共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65536722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com