Czy istnieje jakikolwiek związek między fork() i CreateThread? Czy jest coś, co CreateThread wewnętrznie nazywa fork()?CreateThread vs fork()
Odpowiedz
fork() istnieje tylko w systemach uniksowych i tworzy nowy proces o tym samym stanie, co wywołujący. CreateThread() tworzy nowy wątek w tym samym procesie.
CreateThread - służy do tworzenia wątków, widelca - służy do tworzenia duplikatów procesu. I nie ma natywnego sposobu na posiadanie funkcji fork dla Windows (przynajmniej przez Win32).
Nie ma natywnego sposobu jest niezręczny sposób umieszczenia go, ponieważ jest to NT Native API, który pozwala na dokładnie to. Zgadnij, jak zaimplementowano dawny podsystem POSIX, a teraz SFU/SUA;) ... przeczytaj książkę "Windows NT/2000 Native API" autorstwa Nebbett, zawiera przykładową implementację 'fork()'. – 0xC0000022L
W NT podstawową jednostkę roboczą nazywa się wątkiem (tzn. NT planuje wątki, a nie procesy). Wątki użytkownika działają w kontekście procesu. Kiedy wywołujesz CreateThread, prosisz jądro NT o przydzielenie działającej jednostki w kontekście twojego procesu (masz również włókna, które są zasadniczo wątkami, które możesz zaplanować samemu, ale to jest poza tematem twojego pytania).
Podczas wywoływania funkcji CreateThread udostępnia się funkcję z punktem wejścia, który będzie uruchamiany po wywołaniu funkcji. Kod musi znajdować się w przestrzeni wirtualnej procesu, a strona musi mieć prawa wykonywania. Mówiąc prosto, podajesz wskaźnik funkcji. ;)
fork() to funkcja systemu UNIX, która żąda od jądra utworzenia kopii uruchomionego procesu. Proces macierzysty pobiera pid procesu potomnego, a proces potomny otrzymuje 0 (w ten sposób wiesz, kim jesteś).
Jeśli chcesz utworzyć proces w systemie Windows, wywołaj funkcję CreateProcess, ale nie zachowuje się ona jak fork(). Powodem jest to, że przez większość czasu tworzysz wątki, a nie procesy.
Jak widać, nie ma związku pomiędzy CreateThread i fork.
* Jeśli chcesz utworzyć proces w systemie Windows, wywołaj funkcję CreateProcess, ale nie zachowuje się ona jak fork(). Powodem jest to, że przez większość czasu tworzysz wątki, a nie procesy. * Który jest użyty, jest konsekwencją różnicy między tymi dwoma, a nie powodem :) –
Model procesu Windows i Unix jest zasadniczo bardzo różny, więc nie ma możliwości bezpośredniego mapowania interfejsu API z jednego na drugim.
fork() klonuje bieżący proces na dwa. W procesie macierzystym, fork() zwraca PID i dziecko zwraca 0. To jest zwykle używany tak:
int pid;
if (pid = fork()) {
// this code is executed in the parent
} else {
// this code is executed in the child
}
Cygwin jest warstwa emulacji dla budowania i uruchamiania aplikacji w systemie Windows Unix który emuluje zachowanie fork() przy użyciu CreateProcess().
Uważam, że błędnie oznaczyłeś bloki jako proces * podrzędny * dostaje 0, a rodzic otrzymuje PID dziecka. –
Tak, dziękuję. Naprawiono teraz. (Imponujące, że to niezauważone przez ponad rok.) – JesperE
Znaleziono ten link, który według mnie może być pomocny w usunięciu kilku faktów dotyczących rozwidlenia/gwintowania. Sharing tutaj: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/
Może chcesz wiedzieć Microsoft udostępnia fork() w wersji high-end systemu Windows z komponentu o nazwie Podsystem aplikacji systemu UNIX (SUA). Możesz znaleźć szczegóły w mojej odpowiedzi here.
Windows NT, 2000 itd. Obsługują posix i dlatego obsługują widelec http://www.robelle.com/smugbook/process.html –
Wow. Dlaczego nie jest wymienione w MSDN? – sharptooth
wspomniano tutaj http://support.microsoft.com/kb/149902. Chociaż wygląda na to, że został domyślnie wykupiony w winXP (minęło trochę czasu odkąd mam w systemie windows) http://support.microsoft.com/kb/308259 –