Estaba buscando encontrar la diferencia entre estos cuatro en Google y esperaba que hubiera una gran cantidad de información sobre esto, pero realmente no hubo una comparación sólida entre las cuatro llamadas.
Me puse a tratar de compilar una especie de vistazo básico de un vistazo a las diferencias entre estas llamadas al sistema y esto es lo que obtuve. ¿Es correcta toda esta información / me falta algo importante?
Fork
: La llamada fork básicamente hace un duplicado del proceso actual, idéntico en casi todos los sentidos (no todo se copia, por ejemplo, los límites de recursos en algunas implementaciones, pero la idea es crear una copia lo más cercana posible).
El nuevo proceso (hijo) obtiene una ID de proceso diferente (PID) y tiene el PID del proceso anterior (padre) como su PID padre (PPID). Debido a que los dos procesos ahora están ejecutando exactamente el mismo código, pueden determinar cuál es cuál mediante el código de retorno de fork: el niño obtiene 0, el padre obtiene el PID del niño. Esto es todo, por supuesto, suponiendo que la llamada fork funcione; de lo contrario, no se crea ningún elemento secundario y el padre obtiene un código de error.
Vfork
: La diferencia básica entre vfork y fork es que cuando se crea un nuevo proceso con vfork (), el proceso padre se suspende temporalmente y el proceso hijo podría tomar prestado el espacio de direcciones del padre. Este extraño estado de cosas continúa hasta que el proceso secundario sale o llama a execve (), momento en el cual el proceso primario continúa.
Esto significa que el proceso hijo de vfork () debe tener cuidado para evitar modificar inesperadamente las variables del proceso padre. En particular, el proceso secundario no debe regresar de la función que contiene la llamada vfork (), y no debe llamar a exit () (si necesita salir, debe usar _exit (); en realidad, esto también es cierto para el secundario de un tenedor normal ()).
Exec :
La llamada ejecutiva es una forma de reemplazar básicamente todo el proceso actual con un nuevo programa. Carga el programa en el espacio de proceso actual y lo ejecuta desde el punto de entrada. exec () reemplaza el proceso actual con el ejecutable señalado por la función. El control nunca vuelve al programa original a menos que haya un error exec ().
Clone :
Clone, como fork, crea un nuevo proceso. A diferencia de fork, estas llamadas permiten que el proceso secundario comparta partes de su contexto de ejecución con el proceso de llamada, como el espacio de memoria, la tabla de descriptores de archivos y la tabla de manejadores de señales.
Cuando el proceso hijo se crea con clone, ejecuta la aplicación de función fn (arg). (Esto difiere de fork, donde la ejecución continúa en el hijo desde el punto de la llamada fork original). El argumento fn es un puntero a una función que el proceso hijo invoca al comienzo de su ejecución. El argumento arg se pasa a la función fn.
Cuando la aplicación de la función fn (arg) regresa, el proceso secundario finaliza. El número entero devuelto por fn es el código de salida para el proceso secundario. El proceso secundario también puede finalizar explícitamente llamando a exit (2) o después de recibir una señal fatal.
Información obtenida de forma:
- Diferencias entre fork y exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
¡Gracias por tomarse el tiempo de leer esto! :)
fork()
Linux, y probablemente a todos los BSD) toma prestado el espacio de direcciones de su padre. Todo lo que hace, además de llamar execve()
o _exit()
tiene un gran potencial para confundir a los padres. En particular, los manejadores de exit()
llamadas atexit()
y otros "finalizadores", p. Ej .: lava los flujos stdio. Regresar de un vfork()
niño podría potencialmente (la misma advertencia que antes) ensuciar la pila de los padres.
fork
sistema?