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!