Haben wir irgendeine Art von Beziehung zwischen fork() und CreateThread? Gibt es irgendetwas, das CreateThread intern ruft fork()?CreateThread vs fork()
Antwort
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.
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).
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
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.
* 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 :) –
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().
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. –
Ja, danke. Jetzt behoben. (Beeindruckend, dass dies seit über einem Jahr unbemerkt blieb.) – JesperE
Diesen Link gefunden, von dem ich glaube, dass er bei der Klärung einiger Fakten bezüglich Gabelung/Threading hilfreich sein könnte. Teile hier: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/
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.
- 1. _beginthread vs CreateThread
- 2. CreateThread() zu langsam?
- 3. mehrere Argumente CreateThread-Funktion
- 4. clojure pmap/préducte vs fork-join
- 5. if (fork()) fork()
- 6. Verwendung Createthread mit einem Lambda-
- 7. Fork, Ruby, ActiveRecord und Dateideskriptoren auf Fork
- 8. Java's Fork/Join vs ExecutorService - wann welche verwenden?
- 9. Unterschied zwischen Fork/Join und Map/Reduce
- 10. Named Pipes, mit Fork()
- 11. globale Variablenwert bei fork()
- 12. Fork-Implementierung in Perl
- 13. Golang Fork Prozess
- 14. Printing Fibonacci mit fork()
- 15. A fork() Befehl
- 16. Konzepte auf fork() Systemaufruf
- 17. fork in freeBSD unix
- 18. Fork Concept in C#
- 19. Linux Fork: pid wiederverwenden
- 20. POSIX verstehen - fork()
- 21. c - fork() code
- 22. procs, fork() und mutexes
- 23. Verwendung von fork() falsch?
- 24. Wie verwenden Sie CreateThread für Funktionen, die Klassenmitglieder sind?
- 25. Fork in Multi-Thread-Programm
- 26. C shared memory using fork()
- 27. Wie gibt fork() für Kindprozess
- 28. GitHub Repository Fork in Enterprise
- 29. Java 7: Fork/Join-Framework
- 30. C - fork() und gemeinsamen Speicher
Windows NT, 2000 usw. unterstützen posix und unterstützen daher fork http://www.robelle.com/smugbook/process.html –
Wow. Warum wird es nicht in MSDN erwähnt? – sharptooth
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 –