En un sistema Linux, ¿el proceso secundario ve los subprocesos existentes de la misma manera que el proceso principal?
int main() {
//create thread 1
int child_pid = fork();
if ( 0 == child_pid)
{
..
}
else
{
..
}
Dado que todo el espacio de direcciones se copia para el proceso secundario, ¿qué sucede con el estado de los subprocesos? ¿Qué pasa si el subproceso 1 en el segmento anterior está esperando una señal condicional? ¿También está en el estado de espera en el proceso secundario?
Los subprocesos en Linux hoy en día intentan mantenerse compatibles con POSIX. Solo se replica el subproceso de llamada, no otros subprocesos (tenga en cuenta que, por ejemplo, en Solaris puede elegir qué bifurcación hace según la biblioteca a la que se vincula)
Desde http://www.opengroup.org/onlinepubs/000095399/functions/fork.html (POSIX 2004):
Se debe crear un proceso con un único subproceso. Si un proceso de subprocesos múltiples llama fork()
, el nuevo proceso contendrá una réplica del subproceso de llamada y todo su espacio de direcciones, posiblemente incluidos los estados de mutexes y otros recursos. En consecuencia, para evitar errores, el proceso secundario solo puede ejecutar operaciones seguras de señal asíncrona hasta el momento en que uno de los exec
se llama funciones. Los manipuladores de horquillas pueden establecerse mediante la pthread_atfork()
función para mantener invariantes de aplicación a través de fork()
llamadas
La especificación POSIX 2018 de fork()
es similar.
Los subprocesos no se heredan de un proceso secundario en un sistema Linux que usa fork(). Una fuente detallada está aquí: http://linas.org/linux/threads-faq.html