Gibt es irgendeine Unterstützung des syscall clone(2)
( nicht os.fork
) in Python? Ich möchte mit Linux Namespaces unter Python spielen, aber es scheint, dass es nicht viele Informationen darüber gibt.
Bearbeitungen:
Ich denke, Ctypes mit libc ist die Antwort, aber ich habe immer noch keinen Erfolg. fork funktioniert ohne Probleme, da es kein Argument hat, dann funktioniert dieser Code:
%Vor%Mit Klon versuche ich das:
%Vor%Clone hat tatsächlich diese Signatur:
Int-Klon (int (* fn) (void *), void * child_stack, int flags, void arg, ... / pid_t * ptid, Struktur user_desc * tls, pid_t * ctid * /);
Ich muss noch * child_stack und flags übergeben, habe aber keine Ahnung, wie es geht. Irgendwelche Hilfe?
Weitere Bearbeitungen:
Ich habe das jetzt:
%Vor%Das funktioniert tatsächlich, aber ich stelle mir vor, dass ich mit dem Stack ein großes Loch in meinem System mache, es gibt einen saubereren Weg, dies zu tun?
Bearbeitungen:
Fast fertig, indem Sie das richtige Flag für newpid hinzufügen:
%Vor%Dies ist nicht nur für root ausführbar, und drucken Sie eine schöne 1.
Und nach diesem Beitrag scheint der Stapel in Ordnung zu sein: Ссылка
Nun, schließlich denke ich, dass ich die Antwort bekommen habe, ist einfach Usign ctypes mit libc,
Dies ist ein einfacher Beweis für das Konzept:
%Vor%Dies muss von root ausgeführt werden.
Wenn Sie die Semantik "fork () aber mit neuem Namespace" haben möchten, können Sie stattdessen direkt den SYS_clone
syscall aufrufen. Beachten Sie, dass in diesem Fall die os.getpid()
-Methode die falsche Prozess-ID im untergeordneten Element zurückgibt, da glibc die Prozess-ID zwischenspeichert und nicht über den SYS_clone
-Aufruf informiert, um den Cache ungültig zu machen.
Wenn Sie x86_64 ( NR_clone == 56
, NR_getpid == 39
) annehmen, können Sie libc.syscall(56, signal.SIGCHLD|0x000200000, 0 0 0)
auf "fork" und dann libc.syscall(39)
aufrufen, um die aktuelle PID des "gegabelten" untergeordneten Prozesses abzurufen.
Tags und Links python