Abbiamo qualche tipo di relazione tra fork() e CreateThread? C'è qualcosa che CreateThread chiama internamente fork()?CreateThread vs fork()
risposta
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.
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).
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
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.
* 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 :) –
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().
Credo che tu abbia etichettato i blocchi errati, come il processo * child * ottiene 0 e il genitore ottiene il PID del bambino. –
Sì, grazie. Risolto ora. (Impressionante che questo sia passato inosservato per oltre un anno.) – JesperE
Trovato questo collegamento che credo potrebbe essere utile per chiarire alcuni fatti riguardanti il biforcazione/infilatura. Condivisione qui: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/
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.
- 1. Utilizzare CreateThread con un lambda
- 2. Github: Fork Queue vs Pull Request
- 3. clojure pmap/preduce vs fork-join
- 4. più argomenti per la funzione CreateThread
- 5. Clone-equivalent of fork?
- 6. Comunicazione fork parent genitore
- 7. c - fork() codice
- 8. Diff a git fork
- 9. fork mongodb in windows
- 10. printf anomalia dopo "fork()"
- 11. fork(), exec e waitpid()
- 12. fork() a() ciclo
- 13. Funzione Fork() in C
- 14. Pip installa fork github-repo
- 15. Come usare fork() in Perl?
- 16. fork() processi figlio e genitore
- 17. Bower: installare fork di Bootstrap
- 18. fork() in C utilizzando printf
- 19. pipe() e fork() in c
- 20. a system() o fork()/exec()?
- 21. fork in programma multi-thread
- 22. fork ed exec in bash
- 23. Java 7: Fork/Join Framework
- 24. libCurl Errore SSL dopo fork()
- 25. Come unire un fork parent?
- 26. Processo di fork di Golang
- 27. fork e join utilizzando Akka
- 28. gdb debug del processo figlio dopo il fork (modalità figlio in modalità follow-fork configurata)
- 29. Impossibile allocare memoria: fork: impossibile eseguire il fork di un nuovo processo?
- 30. Qual è la differenza tra chiamare daemon() e chiamare fork(), setsid(), fork(), ecc.?
Windows NT, 2000 ecc. Supportano posix e quindi supportano fork http://www.robelle.com/smugbook/process.html –
Wow. Perché non è menzionato in MSDN? – sharptooth
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 –