2010-05-24 5 views
5

Ich möchte die Namespacing-Funktionen der clone Funktion verwenden. Lesen der Manpage, scheint es wie clone hat viele komplizierte Details, über die ich mir Sorgen machen muss.Klonäquivalent der Gabel?

Gibt es ein gleichwertiges clone Aufruf zu guten ol 'fork()?

Ich bin bereits vertraut mit fork, und glaube, dass wenn ich einen Ausgangspunkt in clone habe, kann ich Flags und Optionen von dort hinzufügen.

Antwort

2

Ich denke, dass dies funktioniert, aber ich bin nicht ganz sicher über einige der Zeigerargumente.

pid_t child = clone(child_f, child_stack, 
      /* int flags    */  SIGCHLD, 
      /* argument to child_f  */  NULL, 
      /* pid_t *pid    */  NULL, 
      /* struct usr_desc * tls */  NULL, 
      /* pid_t *ctid    */  NULL); 

In den Parameter flags das untere Byte davon verwendet wird, um anzugeben, welches Signal die Eltern des Fadens, Dinge zu tun wie Sterben oder stoppen zu benachrichtigen zu senden. Ich glaube, dass alle tatsächlichen Flags Schalter aktivieren, die sich von fork unterscheiden. Betrachtet man den Kernel-Code, ist dies der Fall.

Wenn Sie wirklich etwas in der Nähe fork erhalten möchten Sie vielleicht sys_clone nennen, die wie fork zweimal nicht Funktionszeiger nehmen und stattdessen zurückgibt.

+0

Ich ging Code-Tauchen, weil ich mich immer noch nicht wohl fühlte, aber es sieht so aus, als ob du recht hast. Was ich gefunden habe, ist, dass 'clone' ein sehr dünner Wrapper um' sys_clone' ist, der meistens nur das tut, was notwendig ist, um 'fn' auf dem neuen Stack aufzurufen. 'sys_clone' kehrt tatsächlich wie' fork' zurück, kann aber nicht direkt aufgerufen werden, da die Signatur sich je nach Architektur unterscheidet. 'fork' ist eigentlich ziemlich fett: Es führt Callbacks aus, misc cleanup, benutzt aber im Grunde nur SIGCHLD. (Ich denke, es gibt nichts, was ich tun kann, um die 'fork'-Extras zu emulieren.) –

0

clone() wird verwendet, um einen Thread zu erstellen. Der große Unterschied zwischen clone() und fork() besteht darin, dass clone() so ausgeführt werden soll, dass es an einem separaten Einstiegspunkt beginnt - eine Funktion, während fork() nur vom selben Punkt im Code aus weiterläuft, von dem aus aufgerufen wurde. int (* fn) (void *) in der Manpagedefinition ist die Funktion, die beim Beenden einen int, den exit-Status zurückgibt.

Der nächste Aufruf zum Klonen ist pthread_create(), das im Wesentlichen ein Wrapper für clone() ist. Dadurch erhalten Sie keine Möglichkeit, das fork() - Verhalten zu erhalten.

+1

Guter Punkt. Ich bin nicht sehr besorgt über den 'fn' vs.' return' Unterschied zwischen 'clone' und' fork'. Mein Ziel ist es zu verstehen, wie man dieselben Subprozessmerkmale erhält (und was sie sind). In jedem Fall bietet 'pthread_create' keine Namespacing-Flags an. –

1

Sie können einen normalen untergeordneten Prozess mit fork() abzweigen und dann mithilfe von unshare() einen neuen Namespace erstellen.

Namespaces sind ein bisschen seltsam, ich kann nicht viele Anwendungsfälle für sie sehen.

+1

Es sieht so aus als würde' unshare' nur eine kleine Teilmenge der 'clone' Flags unterstützen. Zum Beispiel möchte ich 'CLONE_NEWNET' verwenden und gibt 'EINVAL' zurück. –