2009-03-06 16 views

risposta

5

fork() esiste solo sui sistemi Unix e crea un nuovo processo con lo stesso stato del chiamante. CreateThread() crea un nuovo thread nello stesso processo.

+2

Windows NT, 2000 ecc. Supportano posix e quindi supportano fork http://www.robelle.com/smugbook/process.html –

+0

Wow. Perché non è menzionato in MSDN? – sharptooth

+0

menzionato qui http://support.microsoft.com/kb/149902. Anche se sembra che sia stato eliminato per impostazione predefinita in winXP (è passato un po 'di tempo da quando ho aggiunto windows) http://support.microsoft.com/kb/308259 –

1

CreateThread - è per thread, fork - è per la creazione di processo duplicato. E non esiste un modo nativo per avere funzionalità di fork per Windows (almeno tramite Win32).

+1

Nessun modo nativo è un modo imbarazzante di metterlo poiché è l'API Native NT che consente esattamente questo. Indovina come sono implementati il ​​precedente sottosistema POSIX e ora SFU/SUA;) ... controlla il libro "Native API di Windows NT/2000" di Nebbett, include un'implementazione di esempio di 'fork()'. – 0xC0000022L

10

In NT, l'unità di lavoro fondamentale viene chiamata thread (ad esempio, NT pianifica i thread, non i processi.). I thread utente vengono eseguiti nel contesto di un processo. Quando chiami CreateThread, chiedi al kernel NT di allocare un'unità funzionante nel contesto del tuo processo (hai anche fibre che sono fondamentalmente thread che puoi programmare da te ma che vanno oltre l'argomento della tua domanda).

Quando si chiama CreateThread, si fornisce alla funzione un punto di ingresso che verrà eseguito dopo la chiamata della funzione. Il codice deve essere all'interno dello spazio virtuale del processo e la pagina deve avere diritti di esecuzione. In parole semplici, si fornisce un puntatore a funzione. ;)

fork() è una funzione UNIX che richiede al kernel di creare una copia del processo in esecuzione. Il processo genitore ottiene il pid del processo figlio e il processo figlio ottiene 0 (in questo modo sai chi sei).

Se si desidera creare un processo in Windows, si chiama la funzione CreateProcess, ma ciò non si comporta come fork(). Il motivo è che la maggior parte delle volte creerai thread, non processi.

Come si può vedere, non esiste alcuna relazione tra CreateThread e fork.

+2

* Se si desidera creare un processo in Windows, si chiama la funzione CreateProcess, ma questo non si comporta come fork(). Il motivo è che la maggior parte delle volte creerai thread, non processi. * Quale di questi viene utilizzato è la conseguenza della differenza tra i due non il motivo :) –

1

Il modello di processo di Windows e Unix è fondamentalmente molto diverso, quindi non c'è modo di mappare direttamente l'API da una all'altra.

fork() clona il processo corrente in due. Nel processo padre, fork() restituisce il pid, e nel bambino restituisce 0. Questo è tipicamente usato in questo modo:

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

Cygwin è uno strato di emulazione per applicazioni Unix costruzione e in esecuzione su Windows che emula il comportamento di fork() utilizzando CreateProcess().

+1

Credo che tu abbia etichettato i blocchi errati, come il processo * child * ottiene 0 e il genitore ottiene il PID del bambino. –

+0

Sì, grazie. Risolto ora. (Impressionante che questo sia passato inosservato per oltre un anno.) – JesperE

1

Si potrebbe desiderare di sapere Microsoft fornisce fork() nelle versioni high-end di Windows con componente chiamato sottosistema per applicazioni basate su UNIX (SUA). Puoi trovare i dettagli nella mia risposta here.