Quelqu'un peut-il expliquer les systèmes d'exploitation suivants.fork() exemple pour moi?
[Code de Programmation Python 4e Édition par Mark Lutz]
"forks child processes until you type 'q'"
import os
def child():
print('Hello from child', os.getpid())
os._exit(0) # else goes back to parent loop
def parent():
while True:
newpid = os.fork()
if newpid == 0:
child()
else:
print('Hello from parent', os.getpid(), newpid)
if input() == 'q': break
parent()
Ce que le code des sorties ran:
Hello from parent 2057 2062
Hello from child 2062
Hello from parent 2057 2068
Hello from child 2068
Hello from parent 2057 2069
Hello from child 2069
Hello from parent 2057 2070
Hello from child 2070
q
Choses que je comprends:
os.fork()
est utilisé pour démarrer un autre processus en parallèle à l'actuel.os.fork()
crée une copie de la précédente Python session et ouvre en parallèle.os.fork()
renvoie l'id de la nouvelle procédure.
Des choses que je ne comprends pas:
- Comment se fait la valeur de
os.getpid()
est jamais modifiée lors de l'exécution du code? - Pourquoi le
child()
fonction jamais appelé? Disons que la valeur denewpid
!= 0, alors le programme afficheraprint('Hello from parent', os.getpid(), newpid)
. Cependant, après cela, il imprime la ligne de l'enfant plutôt que de leur demander pour l'entrée comme c'est le cas après l'instruction if. - Qu'est-ce que
os._exit(0)
faire?
Merci une tonne pour votre temps. 🙂
OriginalL'auteur Always Learning Forever | 2014-06-05
Vous devez vous connecter pour publier un commentaire.
La valeur de
os.getpid()
ne changera jamais pour les parents puisque c'est toujours le même processus. Le pid changera à chaque fois pour l'enfant carfork()
toujours créer un tout nouveau processus enfant clone avec son propre PID.Le processus de l'enfant est appelé, car il y a maintenant deux processus en cours d'exécution. On a appelé l'
child()
fonction, l'autre appelé leprint
fonction. Ils sont tout simplement se battre pour l'impression à l'écran, et vous avez vu le parent impression de "gagner" en premier dans ce cas.Voir ici: https://docs.python.org/2/library/os.html#os._exit
newpid = os.fork()
en cours d'exécution sur le même processus (parent()
)?Mise à jour de ma réponse - oui os.la fourche est exécutée sur le même processus que le parent.
Bon, j'ai l'enfant, cependant, ma question reste la même:
newpid = os.fork()
est en cours d'exécution sur le même processus queos.fork()
deprint('Hello from parent', os.getpid(), newpid)
. Alors, pourquoi est -newpid
montrant les différentes valeurs?newpid = os.fork()
avant de cette ligne, il y a un processus. Après cette ligne, il y a deux processus qui sont exactement les mêmes à l'EXCEPTION de:newpid
sera de 0 pour le processus de l'enfant, etnewpid
de l'enfant pid du processus parent. L', qui ne change jamais de valeur que vous voyez après "bonjour de parent" est le parent de l'id. C'est la valeur après que l'est l'enfant PID (et que l'on est en train de changer)np, bonne chance!
OriginalL'auteur Martin Konecny
while True:
).os.fork
ne! Et la fonction retourne le pid de l'enfant de la mère. De sorte que le parent s'exécute la deuxième partie de laif else
-déclaration, tandis que tous les childs exécuter la première partie, parce queos.fork
pour les processus enfants donne un de 0 de retour.os._exit
est essentiellement une version allégée deos.exit()
, et est destiné pour les processus enfants.newpid
montrant les différentes valeurs? N'est-ce pas en cours d'exécution dans le même processus?OriginalL'auteur Don Question