2010-11-28 12 views
28

consideran este código simple:Después de bifurcar, ¿se comparten las variables globales?

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

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

+0

Estoy de acuerdo con Tom. Podrías haber generado el valor de ambos procesos y haber visto tu salida. Sin embargo, recuerde dormir en el que no espera un aumento en el myvar para que no se ejecute antes de que el otro proceso lo incremente (aunque no lo hará). Pero sí, solo ejecútalo y mira. – Loduwijk

+0

Tenga en cuenta el comentario engañoso: en realidad, el proceso padre incrementa el contador (a menos que el fork falló) y el proceso secundario no hace nada excepto salir inmediatamente. –

+1

Primero, no está verificando el fracaso. En segundo lugar, solo se comparten los descriptores de archivos. – tchrist

Respuesta

39

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 notorio en los otros procesos que son fork() padres, hermanos o descendientes.

Pero sí, el sistema operativo realmente comparte las páginas inicialmente, porque fork implementa copy-on-write, lo que significa que si ninguno de los procesos modifica 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 (vea mmap()) en cuyo caso se compartirán realmente, con todas las advertencias que vienen con eso.

+0

¿Estás seguro de que esta parte 'variable global se puede compartir entre el proceso primario y secundario'? –

3

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

Los subprocesos, por otro lado, comparten variables globales.

+0

No importa si una variable es global o no. – tchrist

+0

@tchrist Lo sé, menciono los globales porque parece que lo que le preocupa a la operación. – Tom

32

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

En otras palabras, no, las variables globales de los padres no se verán alteradas por los cambios en el elemento secundario.

+0

+1 Aunque podría argumentar que "una existencia completamente diferente" puede ser engañosa ya que algunos objetos, como los identificadores de archivos, pueden compartirse bajo diferentes circunstancias, IIRC. –

+0

Es cierto que cada proceso tendrá su propio control sobre los recursos compartidos (archivos, tuberías, etc.) como consecuencia de la "copia exacta". No es muy diferente, de hecho, de dos procesos separados que abren el mismo archivo. –

+4

Hay una diferencia crucial entre dos procesos que abren el mismo archivo y dos procesos que comparten un descriptor de archivo creado antes de bifurcar: los procesos bifurcados comparten la misma descripción y desplazamiento del archivo abierto; si un proceso mueve el puntero del archivo (leyendo, escribiendo o buscando), también afecta al otro. Esto no ocurre con las aperturas separadas porque tienen descripciones de archivo abiertas separadas. Ver: open(), fork(), lseek(), etc. –

8

Después de la bifurcación(), se duplica todo el proceso, incluidas todas las variables globales. El elemento secundario es una réplica exacta del elemento primario, excepto que tiene un PID (ID de proceso) diferente, un elemento primario diferente y fork() devuelto 0. Las variables globales siguen siendo globales en su propio proceso. Entonces, la respuesta es no, las variables globales no se comparten entre procesos después de una llamada a fork().

Cuestiones relacionadas