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