2009-03-06 8 views

Antwort

5

fork() existiert nur auf Unix-Systemen und erstellt einen neuen Prozess mit dem gleichen Status wie der Aufrufer. CreateThread() erstellt einen neuen Thread im selben Prozess.

+2

Windows NT, 2000 usw. unterstützen posix und unterstützen daher fork http://www.robelle.com/smugbook/process.html –

+0

Wow. Warum wird es nicht in MSDN erwähnt? – sharptooth

+0

hier erwähnt http://support.microsoft.com/kb/149902. Obwohl es scheint, dass es standardmäßig in winXP herausgenommen wurde (es ist eine Weile her, seit ich unter Windows c'ed) http://support.microsoft.com/kb/308259 –

1

CreateThread - ist für Threads, fork - ist für die Erstellung von Duplikat-Prozess. Und es gibt keine native Möglichkeit, Fork-Funktionalität für Windows zu haben (zumindest über Win32).

+1

Kein systematischer Weg ist eine unangenehme Art, es zu setzen, da es die NT Native API ist, die genau das ermöglicht. Raten Sie, wie das frühere POSIX-Subsystem und jetzt SFU/SUA implementiert sind;) ... lesen Sie das Buch "Windows NT/2000 Native API" von Nebbett, es enthält eine Beispielimplementierung von 'fork()'. – 0xC0000022L

10

In NT wird die grundlegende Arbeitseinheit als Thread bezeichnet (dh NT plant Threads, keine Prozesse.). Benutzer-Threads werden im Kontext eines Prozesses ausgeführt. Wenn Sie CreateThread aufrufen, fordern Sie den NT-Kernel auf, im Kontext Ihres Prozesses eine Arbeitseinheit zuzuordnen (Sie haben auch Fasern, die im Grunde genommen Threads sind, die Sie selbst planen können, aber das ist über das Thema Ihrer Frage hinaus).

Wenn Sie CreateThread aufrufen, stellen Sie die Funktion mit einem Einstiegspunkt bereit, der ausgeführt wird, nachdem die Funktion aufgerufen wurde. Der Code muss sich im virtuellen Bereich des Prozesses befinden und die Seite muss Ausführungsrechte haben. Einfach ausgedrückt, geben Sie einen Funktionszeiger. ;)

fork() ist eine UNIX-Funktion, die den Kernel anweist, eine Kopie des laufenden Prozesses zu erstellen. Der Elternprozess erhält die PID des Kindprozesses und der Kindprozess erhält 0 (auf diese Weise wissen Sie, wer Sie sind).

Wenn Sie einen Prozess in Windows erstellen möchten, rufen Sie die CreateProcess-Funktion auf, aber das verhält sich nicht wie fork(). Der Grund dafür ist, dass Sie in den meisten Fällen Threads erstellen, keine Prozesse.

Wie Sie sehen können, gibt es keine Beziehung zwischen CreateThread und fork.

+2

* Wenn Sie einen Prozess in Windows erstellen möchten, rufen Sie die CreateProcess-Funktion auf, die sich jedoch nicht wie fork() verhält. Der Grund dafür ist, dass du meistens Threads erstellst, keine Prozesse. * Was benutzt wird, ist die Konsequenz des Unterschieds zwischen den beiden, nicht der Grund :) –

1

Das Windows- und Unix-Prozessmodell unterscheidet sich grundlegend. Daher gibt es keine Möglichkeit, die API direkt aufeinander abzubilden.

fork() klont den aktuellen Prozess in zwei. In dem übergeordneten Prozess, fork() gibt die pid und in dem Kind gibt es 0. Diese Regel wie folgt verwendet:

int pid; 
if (pid = fork()) { 
    // this code is executed in the parent 
} else { 
    // this code is executed in the child 
} 

Cygwin ist eine Emulationsschicht für das Erstellen und Ausführen Unix-Anwendungen unter Windows der emuliert das Verhalten von fork() mit CreateProcess().

+1

Ich glaube, du hast die Blöcke falsch beschriftet, wie der * Kind * -Prozess erhält 0, und der Elternteil erhält die PID des Kindes. –

+0

Ja, danke. Jetzt behoben. (Beeindruckend, dass dies seit über einem Jahr unbemerkt blieb.) – JesperE

1

Vielleicht möchten Sie wissen, Microsoft bietet fork() in High-End-Versionen von Windows mit der Komponente Subsystem für UNIX-basierte Anwendungen (SUA) genannt. Details finden Sie in meiner Antwort here.