Я пытаюсь запустить одну и ту же программу в двух linux пространствах имен.
Программа должна прочитать и записать файл /tmp/server.log.
Поэтому я хочу убедиться, что программа A читает / записывает server.log, но на самом деле она читает и пишет /tmp/server-A.log. А для программы B read / write server.log это фактически чтение и запись /tmp/server-B.log.
Я пытаюсь использовать mount, но безуспешно ... Кто-нибудь может мне помочь? Или для меня есть другой способ обеспечить изоляцию файлов, чтобы две программы фактически не читали и не записывали один и тот же файл?
#define _GNU_SOURCE
#include<sched.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
static int child_func(void* arg) {
system("mount --bind /tmp ./a");
FILE* file;
file = fopen("/tmp/server.log","rw");
// write some log ...
return 0;
}
static int child2_func(void* arg) {
system("mount --bind /tmp ./b");
file = fopen("/tmp/server.log","rw");
// write some log....
return 0;
}
int main(int argc, char** argv) {
// Allocate stack for child task.
const int STACK_SIZE = 1 * 1024 * 1024;
char* stack = malloc(STACK_SIZE);
char* stack2 = malloc(STACK_SIZE);
if (!stack || !stack2) {
perror("malloc");
exit(1);
}
pid_t pid,pid2;
if ((pid = clone(child_func, stack + STACK_SIZE, CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWNET | SIGCHLD, NULL)) == -1) {
perror("clone");
exit(1);
}
if ((pid2 = clone(child2_func, stack2 + STACK_SIZE, CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWNET | SIGCHLD, NULL)) == -1) {
perror("clone");
exit(1);
}
waitpid(pid,NULL,0);
waitpid(pid2,NULL,0);
return 0;
}
Обновление: я решаю проблему, основываясь на решениях, на которые даны ответы ниже! Их решения действительно помогают мне!