linux clone()将-1作为子项返回

linux clone()将-1作为子项返回,c,linux,docker,C,Linux,Docker,我有以下计划: #define _GNU_SOURCE #include<sched.h> #include<stdio.h> #include<stdlib.h> #include<sys/wait.h> #include<unistd.h> static char child_stack[2048]; static int child_fn() { printf("Pid: %ld\n", (long) getpid()

我有以下计划:

#define _GNU_SOURCE
#include<sched.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>

static char child_stack[2048];

static int child_fn() {
    printf("Pid: %ld\n", (long) getpid());
    return 0;
}

int main() {
    pid_t child_pid = clone(child_fn, child_stack+1024, CLONE_NEWPID | CLONE_NEWNS | SIGCHLD, NULL);
    printf("clone()= %ld\n", (long) child_pid);

    waitpid(child_pid, NULL, 0);
    return 0;
}
有人能帮我理解为什么会这样吗

注意:我用
ubuntu:latest
docker
图像下运行这个。还请注意,提示是
#
而不是
$
,因此它是否与运行此进程的用户有关,在本例中可能是
root


正如我在评论中提到的那样,我使用了
strerror(3)
来找出我出错的原因。错误是
不允许操作
。我搜索了一下,在这里找到了解决方案-


所以要修复它,我所要做的就是用
--privileged
标志运行docker容器,这意味着调用失败,您需要检查原因。您确实需要学习阅读手册页,因为手册页上写得很清楚。除非您有充分的理由,否则我建议您使用POSIX标准API,即,对于进程使用
fork()
,对于线程使用
pthread\u create()
。在这些标准函数中使用
clone()
是不必要的,它将您的代码限制在Linux上。@Someprogrammerdude抱歉,我错过了关于errno的那一节。我才刚刚开始。我使用strerror(3)查看原因,我得到了
不允许的操作
# ./clone                                                                                                       
clone()= -1