Как создать несколько сетевых пространств имен из одного экземпляра процесса

Я использую следующую функцию C для созданияmultiple network namespaces изsingle process instance:

void create_namespace(const char *ns_name)
{
    char ns_path[100];

    snprintf(ns_path, 100, "%s/%s", "/var/run/netns", ns_name);
    close(open(ns_path, O_RDONLY|O_CREAT|O_EXCL, 0));
    unshare(CLONE_NEWNET);
    mount("/proc/self/ns/net", ns_path, "none", MS_BIND , NULL);
}

После того, как мой процесс создает все пространства имен, и я добавляюtap интерфейс к любому из одного сетевого пространства имен (сip link set tap1 netns ns1 команда), тогда я на самом деле вижу этот интерфейс во всех пространствах имен (предположительно, это фактически одно пространство имен, которое идет под разными именами).

Но если я создаю несколько пространств имен, используя несколько процессов, то все работает просто отлично.

Что здесь может быть не так? Нужно ли передавать какие-либо дополнительные флагиunshare() получить это работает из одного экземпляра процесса? Есть ли ограничение, что один экземпляр процесса не может создавать несколько сетевых пространств имен? Или есть проблема сmount() позвони, потому что/proc/self/ns/net на самом деле монтируется несколько раз?

Update: Кажется, чтоunshare() Функция правильно создает несколько сетевых пространств имен, но все точки монтирования в/var/run/netns/ фактически ссылка на первое сетевое пространство имен, которое было смонтировано в этой директории.

Update2: Кажется, что лучший подход - это запустить fork () другого процесса и выполнить оттуда функцию create_namespace (). В любом случае, я был бы рад услышать лучшее решение, которое не включает вызов fork () или хотя бы получить подтверждение, которое доказало бы, что невозможно создать и управлять несколькими сетевыми пространствами имен из одного процесса.

Update3: Я могу создать несколько пространств имен с помощью unshare (), используя следующий код:

int  main() {
    create_namespace("a");
    system("ip tuntap add mode tap tapa");
    system("ifconfig -a");//shows lo and tapA interface
    create_namespace("b");
    system("ip tuntap add mode tap tapb");
    system("ifconfig -a");//show lo and tapB interface, but does not show tapA. So this is second namespace created.
}

Но после завершения процесса я выполняюip netns exec a ifconfig -a а такжеip netns exec b ifconfig -a кажется, что обе команды были внезапно выполнены в пространстве именa, Таким образом, настоящая проблема заключается в хранении ссылок на пространства имен (или правильном вызове mount (). Но я не уверен, возможно ли это).

Ответы на вопрос(2)

Ваш ответ на вопрос