bifurcación e hilos existentes?

2 minutos de lectura

avatar de usuario
Mac13

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?

avatar de usuario
nos

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.

  • Gracias. El enlace es de gran ayuda.

    – Mac13

    2 de julio de 2009 a las 23:39

avatar de usuario
dlowe

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

  • Esas preguntas frecuentes están muy desactualizadas. La mayor diferencia visible para el usuario es que LinuxThreads ha quedado obsoleto por NPTL desde el kernel 2.6 y glibc 2.3, lo que resuelve todos los problemas pendientes con el comportamiento de subprocesos que no son similares a POSIX.

    – efímero

    2 de julio de 2009 a las 18:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad