[Examen Julio 2017] Problema 2.a

[Examen Julio 2017] Problema 2.a

de Luis Ignacio Perdomo Berton -
Número de respuestas: 2
No estoy entendiendo por que los procesos acceden a las distintas secciones del if.

Segun como lo entiendo yo, los procesos tendrian que entrar de la siguiente manera:

Ya que, segun tengo entendido, despues de ocurrir un fork el proceso padre guarda la pid del proceso hijo, y el proceso hijo en esa variable guarda 0, teniendo entonces para este caso:
     |pid1 |pid2|

P1|algo |algo|

P2|   0   |algo|

P3|  0    |   0   |

P4|  0    |    0  |

Yo asumi que al principio pid1 y pid2 estaban inicialadas en 0, pero igual, si no lo estuvieran, P3 y P4 no deberian tomar el mismo camino? Por que la respuesta correcta involucra que P3 guarda en pid1 un valor distinto a 0, mientras que P4 no?

Adjunto programa.png
En respuesta a Luis Ignacio Perdomo Berton

Re: [Examen Julio 2017] Problema 2.a

de Maximiliano Andres Barragan Pavoni -
Buenas.
Me parece que es un error asumir que estaban inicializados en 0 o en cualquier otro valor, sino que tenés que usar el valor de la variable del padre.

Como decís, al hacer el fork() la función le retorna al proceso padre el pid del proceso hijo que acaba de crear, y al hijo le retorna 0.
En este caso, al hacerse el primer fork() se crea P2 (el primer hijo de P1), entonces:
- En P1: pid1 != 0 (será el pid de P2).
- En P2: pid1 = 0.

Luego, tanto P1 como P2 ejecutan el segundo fork. En particular, siendo P3 el segundo hijo de P1 y P4 el hijo de P2:
- En P1: pid1 y pid2 serán distintos de 0, ya que van a ser iguales al pid de P2 y de P3, respectivamente.
- En P2: pid1 = 0 y pid2 != 0 (ya que será el pid de P4).
- En P3: pid1 != 0, ya que es hijo de P1 (y pid1 no es 0 en P1) y pid2 = 0, ya que es el hijo que se acaba de crear.
- En P4: pid1 = 0, ya que pid1 = 0 en P2 (padre) y pid2 = 0, ya que es el hijo que se acaba de crear.

Usando tu notación quedaría:

     |pid1 |pid2|

P1|algo |algo|

P2|   0   |algo|

P3|algo |   0   |

P4|  0    |    0  |


En resumen, P3 yP4 no ejecutan lo mismo porque como pid1 es distinto en sus padres, en ellos también. Esto es porque al hacerse el fork, se crea una copia exacta del contenido del espacio de memoria del padre, en particular, pid1 va a ser el mismo que el de su padre. Si estoy equivocado, por favor corrijanme!

Saludos!