长话短说,我正在尝试进行操作系统虚拟化。为此,我取消共享父进程的安装名称空间和PID名称空间,然后将其分叉。但是,当子进程尝试执行某些命令时,尽管我没有取消共享(CLONE_NEWPID),但我可以看到还有许多其他的PID
这是我的代码的简化版本:
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main (int argc, char *argv[])
{
int status = unshare(CLONE_NEWNS | CLONE_NEWPID);
if (status == -1)
{
fprintf(stderr, "An error occured %m.\n");
return -1;
}
int pid = fork();
if (pid == 0)
{
if (execv(argv[1], &argv[1]) == -1)
{
fprintf(stderr, "Error when executing %s", argv[1]);
}
//system("pstree");
}
else if (pid > 0)
{
int status = 0;
wait(&status);
}
else
{fprintf(stderr, "An error occured.\n");}
return 0;
}
我按如下方式运行此代码:sudo ./exec / bin / bash,我可以看到它正在执行,因为我的终端随后突然从username @ abc更改为root @ abc。但是当我输入pstree时,我可以看到还有许多其他进程正在运行,并且/ bin / bash没有pid1。但是联机帮助页上的状态是:
CLONE_NEWPID
.... The first child created by the calling process will have the process ID 1 and will assume the role of init(1) in the new namespace.
有人可以告诉我为什么我看到所有其他进程都在运行吗?
答案 0 :(得分:0)
您是否将行为与unshare -fp /bin/bash
进行了比较?
因为我的行为相同,而且看起来很正常!
如this答案中所述,您还应该在名称空间中重新挂载/proc
伪文件系统。否则,ps “作弊” 并从/ proc而不是本地读取全局信息。