#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #define DIR1 "/tmp/dir1_%d" #define DIR2 "/tmp/dir2_%d" int main(void) { /* unshare -rm: new mount + user namespace */ if (getuid() != 0 && unshare(CLONE_NEWNS | CLONE_NEWUSER) == -1) { perror("unshare"); return 1; } int nprocs = get_nprocs(); int id = 0; for (int i = 1; i < nprocs; i++) { pid_t pid = fork(); if (pid == -1) { perror("fork"); return 1; } if (pid == 0) { id = i; break; } } char dir1[32], dir2[32]; snprintf(dir1, sizeof(dir1), DIR1, id); snprintf(dir2, sizeof(dir2), DIR2, id); mkdir(dir1, 0755); mkdir(dir2, 0755); while (1) { if (mount(dir1, dir2, NULL, MS_BIND, NULL) == -1) { fprintf(stderr, "mount --bind %s %s: %s\n", dir1, dir2, strerror(errno)); return 1; } if (umount(dir2) == -1) { fprintf(stderr, "umount %s: %s\n", dir2, strerror(errno)); return 1; } } return 0; }