Después de la bifurcación, ¿se comparten las variables globales?

3 minutos de lectura

Considere este código simple:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

Cuando el niño incrementa myvar, ¿el valor se comparte con el padre (como pthread)?

  • Estoy de acuerdo con Tom. Podría haber generado el valor de ambos procesos y haber visto por sí mismo cuál fue el resultado. Aunque recuerde dormir en el que no espera un aumento en myvar para que no se ejecute antes de que el otro proceso lo incremente (aunque no lo hará). Pero sí, solo ejecútalo y verás.

    – Loduwijk

    28 de noviembre de 2010 a las 20:16

  • Tenga en cuenta el comentario engañoso: en realidad, el proceso principal incrementa el contador (a menos que falle la bifurcación) y el proceso secundario no hace nada más que salir inmediatamente.

    –Jonathan Leffler

    28 de noviembre de 2010 a las 23:52

  • En primer lugar, no está comprobando si hay fallas. En segundo lugar, solo se comparten los descriptores de archivos.

    – cristo

    28 de noviembre de 2010 a las 23:59

No y sí.

No, no se comparten de ninguna manera que sea visible para el programador; los procesos pueden modificar sus propias copias de las variables de forma independiente y cambiarán sin ningún efecto notable en los otros procesos que son fork() padres, hermanos o descendientes.

Pero sí, el sistema operativo realmente comparte las páginas inicialmente, porque la bifurcación implementa la copia en escritura, lo que significa que siempre que ninguno de los procesos modifique las páginas, se comparten. Esta es, sin embargo, una optimización que puede ser ignorada.

Si desea tener variables compartidas, colóquelas en un mapeo compartido anónimo (consulte mmap()), en cuyo caso realmente se compartirán, con todas las advertencias que conlleva.

  • ¿Estás seguro de esta parte? global variable can be shared among parent and child process ?

    – Ahmed Hamdy

    4 mayo 2014 a las 21:09

fork()ing crea una copia exacta del proceso padre en el momento de bifurcar. Sin embargo, después de la fork() se completa, el niño tiene una existencia completamente diferente y no informará al padre.

En otras palabras, no, las variables globales del padre no se verán alteradas por cambios en el hijo.

  • +1 Aunque diría que la “existencia completamente diferente” puede ser engañosa ya que algunos objetos, como los identificadores de archivos, pueden compartirse en diferentes circunstancias, IIRC.

    usuario166390

    28 de noviembre de 2010 a las 23:15


  • Es cierto que cada proceso tendrá su propio identificador para los recursos compartidos (archivos, conductos, etc.), como consecuencia de la “copia exacta”. De hecho, no es muy diferente de dos procesos separados que abren el mismo archivo.

    – Kevin Lacquement

    28 de noviembre de 2010 a las 23:34

  • Hay una diferencia crucial entre dos procesos que abren el mismo archivo y dos procesos que comparten un descriptor de archivo creado antes de la bifurcación: los procesos bifurcados comparten la misma descripción de archivo abierto y compensación; si un proceso mueve el puntero del archivo (al leer, escribir o buscar), también afecta al otro. Esto no sucede con aperturas separadas porque tienen descripciones de archivos abiertos separadas. Ver: open(), fork(), lseek(), etc.

    –Jonathan Leffler

    28 de noviembre de 2010 a las 23:49

  • Gracias, no sabía eso. O, si lo sabía, lo olvidé. Ha pasado mucho tiempo desde que fork()ed.

    – Kevin Lacquement

    28 de noviembre de 2010 a las 23:57

avatar de usuario
Tharun

Después de fork(), se duplica todo el proceso, incluidas todas las variables globales. El hijo es una réplica exacta del padre, excepto que tiene un PID (Id. de proceso) diferente, un padre diferente y fork() devolvió 0. Las variables globales siguen siendo globales dentro de su propio proceso. Entonces la respuesta es no, las variables globales no se comparten entre procesos después de una llamada a fork().

No, ya que las variables globales no se comparten entre procesos a menos que se implemente algún mecanismo IPC. Se copiará el espacio de memoria. Como consecuencia, la variable global en ambos procesos tendrá el mismo valor inmediatamente después de la bifurcación, pero si uno la cambia, el otro no la verá cambiada.

Los hilos, por otro lado, comparten variables globales.

¿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