namespace 구별해 프로세스 생성

EEEFFEE·2023년 12월 3일
0

kdt system-project note

목록 보기
15/15


최초 작성

  • /ui/web_browser.c : clone() 시스템 콜을 통해 다른 namespace에 프로세스 생성하는 코드 추가

#define STACK_SIZE (1024 * 1024)
#define _GNU_SOURCE

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sched.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>

...

//	새로 생성할 프로세스
static int child_func(){

    printf("\n\n______________________________\n\n");
    printf("web server PID: %d, PPID %d \n", getpid(), getppid());


    printf("user id : %d, euid : %d ", getuid(), geteuid());
    printf("\n\n______________________________\n\n");

    if(execl("/usr/local/bin/filebrowser", "filebrowser", "-p", "8282", (char *) NULL) < 0){
        perror("execl failed : child_func");
    }
}

static int child_func(){

    printf("\n\n______________________________\n\n");
    printf("web server PID: %d, PPID %d \n", getpid(), getppid());


    printf("user id : %d, euid : %d ", getuid(), geteuid());
    printf("\n\n______________________________\n\n");

    if(execl("/usr/local/bin/filebrowser", "filebrowser", "-p", "8282", (char *) NULL) < 0){
        perror("execl failed : child_func");
    }
}

//	clone()을 통해 프로세스를 새로운 namespace에 생성
int create_web_server()
{
    pid_t systemPid;

    printf("Creating web_server process\n");
	sleep(3);
    char *stack = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, 
                       MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
    if (stack == MAP_FAILED){
        perror("mmap failed : create web server");
        exit(0);
    }
    
    pid_t child_pid = clone(child_func, stack + STACK_SIZE, CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | 
                                CLONE_NEWNS | SIGCHLD, NULL);
                                
	if(child_pid < 0){
        perror("clone failed : create_webserver");
        return -1;
    }

    munmap(stack, STACK_SIZE);

    waitpid(child_pid, NULL, 0);

    return 0;
}

0개의 댓글

관련 채용 정보