¿Tenemos algún tipo de relación entre fork() y CreateThread? ¿Hay algo que CreateThread internamente llame fork()?CreateThread vs fork()
Respuesta
fork() solo existe en sistemas Unix y crea un nuevo proceso con el mismo estado que el llamador. CreateThread() crea un nuevo hilo en el mismo proceso.
CreateThread - es para hilos, horquilla - es para crear procesos duplicados. Y no hay una forma nativa de tener la funcionalidad de fork para Windows (al menos a través de Win32).
Ninguna forma nativa es una forma incómoda de expresarlo, ya que es la NT Native API que permite exactamente eso. Adivina cómo se implementaron el antiguo subsistema POSIX y ahora SFU/SUA;) ... echa un vistazo al libro "Windows NT/2000 Native API" de Nebbett, incluye una implementación de ejemplo de 'fork()'. – 0xC0000022L
En NT, la unidad de trabajo fundamental se denomina subproceso (es decir, NT programa subprocesos, no procesos). Los hilos de usuario se ejecutan en el contexto de un proceso. Cuando llamas a CreateThread, solicitas al kernel de NT que asigne una unidad de trabajo dentro del contexto de tu proceso (también tienes fibras que son básicamente hilos que puedes programar tú mismo pero que van más allá del tema de tu pregunta).
Cuando llama a CreateThread proporciona la función con un punto de entrada que se ejecutará después de que se llame a la función. El código debe estar dentro del espacio virtual del proceso y la página debe tener derechos de ejecución. En pocas palabras, le da un puntero a la función. ;)
fork() es una función de UNIX que solicita al kernel que cree una copia del proceso en ejecución. El proceso principal obtiene el pid del proceso secundario y el proceso secundario obtiene 0 (de esta manera usted sabe quién es).
Si desea crear un proceso en Windows, llame a la función CreateProcess, pero eso no se comporta como fork(). La razón es que la mayoría de las veces crearás hilos, no procesos.
Como puede ver, no hay relación entre CreateThread y fork.
* Si desea crear un proceso en Windows, llame a la función CreateProcess, pero eso no se comporta como fork(). La razón es que la mayoría de las veces crearás hilos, no procesos. * Cuál se usa es la consecuencia de la diferencia entre los dos, no es la razón :) –
El modelo de proceso de Windows y Unix es fundamentalmente muy diferente, por lo que no hay forma de asignar directamente la API de una encima de la otra.
fork() clona el proceso actual en dos. En el proceso padre, tenedor() devuelve el pid, y en el niño devuelve 0. Esto se utiliza normalmente como esto:
int pid;
if (pid = fork()) {
// this code is executed in the parent
} else {
// this code is executed in the child
}
Cygwin es una capa de emulación para crear y ejecutar aplicaciones Unix en Windows, que emula el comportamiento de la horquilla() usando CreateProcess().
Creo que etiquetaste los bloques incorrectamente, como el proceso * child * obtiene 0 y el padre obtiene el PID del niño. –
Sí, gracias. Corregido ahora. (Impresionante que esto pasó desapercibido por más de un año). – JesperE
Encontré este enlace que creo que podría ser útil para aclarar algunos hechos relacionados con bifurcación/enhebrado. Sharing aquí: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/
Es posible que desee saber Microsoft proporciona tenedor() en las versiones de gama alta de las ventanas con componente llamado Subsistema para aplicaciones basadas en UNIX (SUA). Puede encontrar detalles en mi respuesta here.
- 1. _beginthread vs CreateThread
- 2. clojure pmap/preduce vs fork-join
- 3. Github: Fork Queue vs Pull Request
- 4. argumentos múltiples para la función CreateThread
- 5. fork() en for() loop
- 6. fork() proceso de ejecución
- 7. Fork y Execlp
- 8. ¿Qué hace fork = "true"?
- 9. fork() procesos secundarios y secundarios
- 10. Java 7: Fork/Join Framework
- 11. ¿Cuál es la diferencia entre llamar a daemon() y llamar a fork(), setsid(), fork(), etc.?
- 12. Recursos sobre el próximo marco fork-join
- 13. ¿Cómo devuelve fork() para el proceso secundario
- 14. diferencia entre fork y branch en github
- 15. No entiendo este ejemplo de fork()
- 16. fork() y wait() con dos procesos secundarios
- 17. Problema al horquillar fork() múltiples procesos Unix
- 18. fork dentro de la aplicación Cocoa
- 19. Uso de memoria compartida con fork()
- 20. fork() ramas más de lo esperado?
- 21. Liberando recursos de C++ y fork-exec?
- 22. Use fork-and-join en JDK6
- 23. C: Exec/fork> Procesos difuntos
- 24. Visibilidad de la memoria en Fork-join
- 25. acerca de fork y execve system call
- 26. Cómo manejar errores execvp (...) después de fork()?
- 27. fork() - múltiples procesos y llamadas al sistema
- 28. ¿Cuántos child_processes debería fork() en node.js?
- 29. ¿Cómo se usa CreateThread para las funciones que son miembros de la clase?
- 30. Etiqueta: ¿Versión tope mi fork del proyecto opensource?
Windows NT, 2000 etc. soportan posix y, por lo tanto, admiten fork http://www.robelle.com/smugbook/process.html –
Wow. ¿Por qué no se menciona en MSDN? – sharptooth
mencionado aquí http://support.microsoft.com/kb/149902. Aunque parece que se ha eliminado de forma predeterminada en winXP (ha pasado un tiempo desde que he c'ed en Windows) http://support.microsoft.com/kb/308259 –