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