Linux C-无法正确取消共享PID名称空间

时间:2018-07-26 14:41:16

标签: c linux

长话短说,我正在尝试进行操作系统虚拟化。为此,我取消共享父进程的安装名称空间和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. 

有人可以告诉我为什么我看到所有其他进程都在运行吗?

1 个答案:

答案 0 :(得分:0)

您是否将行为与unshare -fp /bin/bash进行了比较? 因为我的行为相同,而且看起来很正常!

this答案中所述,您还应该在名称空间中重新挂载/proc伪文件系统。否则,ps “作弊” 并从/ proc而不是本地读取全局信息。