Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否仅与多个子进程中的一个子进程共享内存?_C_Linux_Security_Shared Memory - Fatal编程技术网

C 是否仅与多个子进程中的一个子进程共享内存?

C 是否仅与多个子进程中的一个子进程共享内存?,c,linux,security,shared-memory,C,Linux,Security,Shared Memory,我正在使用Linux上的C语言开发一个应用程序,它管理多个沙盒环境,每个沙盒环境都有自己的内核名称空间。这些环境最终将尽可能地与系统的其余部分以及彼此隔离,但仍然需要通过共享内存区域与它们通信的能力。目前,我通过mmaping共享内存与MAP\u shared和MAP\u ANONYMOUS实现了这一点,但这当然允许所有子进程访问我的应用程序的所有共享内存。似乎没有一种简单的/“内置”方式来指定一个内存区域将与一个子进程共享(即非私有),但也不是与所有子进程共享(即非共享) 将共享内存访问限制为

我正在使用Linux上的C语言开发一个应用程序,它管理多个沙盒环境,每个沙盒环境都有自己的内核名称空间。这些环境最终将尽可能地与系统的其余部分以及彼此隔离,但仍然需要通过共享内存区域与它们通信的能力。目前,我通过
mmap
ing共享内存与
MAP\u shared
MAP\u ANONYMOUS
实现了这一点,但这当然允许所有子进程访问我的应用程序的所有共享内存。似乎没有一种简单的/“内置”方式来指定一个内存区域将与一个子进程共享(即非
私有
),但也不是与所有子进程共享(即非
共享


将共享内存访问限制为其中一个的最佳方法是什么?我可以想象每个沙箱使用一个受信任的子进程来实现这一点,但这似乎有点麻烦,而且过于复杂——肯定有更好的方法来实现这一点吗?

我假设父进程希望与所有子进程进行对话,但每个子进程只应该“看到”父进程


每个孩子需要一个mmap句柄。首先,创建尽可能多的句柄,因为您希望有子对象。然后,对于每个子进程,克隆并关闭除fork所针对的子进程之外的所有句柄(这将取消子进程的禁用内存映射),然后要么留在进程中运行子代码,要么执行子二进制文件,保留打开的句柄。

Yes,您的假设是正确的-所有子进程都是父进程,但子进程无法访问任何非“为他们”访问的内容。有趣的方法,但除非我误解了您的建议,否则如果我需要在父进程的整个生命周期内动态添加和删除子进程,而让其他子进程继续运行(我会这样做),我真的看不出这将如何工作。有没有一种方法可以在不关闭其他人正在使用的句柄的情况下生成新的子进程?
#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 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.