Klonprozessunterstützung in Python

8

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: Ссылка

    
Jorge E. Cardona 14.11.2012, 05:44
quelle

2 Antworten

6

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.

    
Jorge E. Cardona 14.11.2012 07:34
quelle
0

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.

    
mkj 08.05.2013 01:58
quelle

Tags und Links