2009-03-06 16 views

Odpowiedz

5

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.

+2

Windows NT, 2000 itd. Obsługują posix i dlatego obsługują widelec http://www.robelle.com/smugbook/process.html –

+0

Wow. Dlaczego nie jest wymienione w MSDN? – sharptooth

+0

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 –

1

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).

+1

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

10

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.

+2

* 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 :) –

1

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().

+1

Uważam, że błędnie oznaczyłeś bloki jako proces * podrzędny * dostaje 0, a rodzic otrzymuje PID dziecka. –

+0

Tak, dziękuję. Naprawiono teraz. (Imponujące, że to niezauważone przez ponad rok.) – JesperE

1

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.