Exemple 2 de fork (compartició de CEE i CES)

Carregueu els programes A (amb A.py) i B (amb B.py). Feu que A i B siguin executables i la variable d’entorn PATH tingui en compte el vostre directori de treball.

El programa A després de presentar-se, crea un clon de sí mateix. El clon desapareix per que es carregui el programa B. Com que els clons hereten el recursos de qui els genera, ambdós programes, A i B, comparteixen el mateix canal estàndard de sortida. Després de crear el clon, llegeix pel canal estàndard d’entrada i escriu el llegit pel canal estàndard de sortida cinc vegades. Després “acomiada esperant que acabi el fill entreforcat.

El programa B després de presentar-se, fa gairebé el mateix que A. Per tal d’identificar si el que escriu és A o B, a l’inici de les línies escrites apareix qui les escriu

Programa A:

import os
import time

def A():
    print('Hola, soc el programa A')
    noupid = os.fork()
    if noupid == 0:
        print("Hola, soc fill d'A. Vaig a transformar-me en B")
        os.execl('./B', './B')  #Substituïm per programa B 
        os._exit(1)      # Aquí no ha d'arribar
    else:
        for _ in range(5):
            s = input()
            print('A:', s)
        print("Això és tot per part d'A")
        pid, retorn = os.wait()
        print('Ha acabat ', pid)
        os._exit(0)
        
if __name__ == "__main__":
   A()

Programa B:

import os
import time

def B():
    print('Hola, soc el programa B')
    for _ in range(5):
        s=input()
        print('B: ',s)
    print("Això és tot per part de B")
    os._exit(0)
    
if __name__ == "__main__":
   B()

Per exemple:

$ A
Hola, soc el programa A
Hola, soc fill d'A. Vaig a transformar-me en B
Hola, soc el programa B
a
A: a
b
B:  b
c
A: c
d
B:  d
e
B:  e
f
A: f
g
B:  g
h
A: h
i
B:  i
Això és tot per part de B
j
A: j
Això és tot per part d'A
Ha acabat  1410549