2014-06-05 4 views
8

[codice preso dal programmazione Python 4a edizione di Mark Lutz]Qualcuno potrebbe spiegare il seguente esempio di os.fork()?

"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() 

Quali le uscite codice quando correva:

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 

Le cose che mi capiscono:

  1. os.fork() viene utilizzato per avviare un altro processo in parallelo a quello attuale.
  2. os.fork() crea una copia della precedente sessione Python e la apre in parallelo.
  3. os.fork() restituisce l'id del nuovo processo.

Le cose che non capisco:

  1. Come mai il valore di os.getpid() non è mai cambiato quando il codice viene eseguito?
  2. Perché viene mai chiamata la funzione child()? Diciamo che il valore di newpid! = 0, quindi il programma verrà stampato print('Hello from parent', os.getpid(), newpid). Tuttavia, dopo di ciò, stampa la riga dal bambino piuttosto che chiedere un input poiché il caso è dopo l'istruzione if.
  3. Che cosa fa os._exit(0)?

Grazie mille per il vostro tempo. :)

risposta

5

1: Come mai il valore di os.getpid() non viene mai modificato quando il codice viene eseguito?

Il valore di os.getpid() non cambierà mai per il genitore poiché è sempre lo stesso processo. Il pid cambierà ogni volta per il bambino poiché fork() crea sempre un clone di processo figlio nuovo di zecca con il proprio PID.

2: Perché la funzione child() viene mai chiamata? Diciamo che il valore di newpid! = 0, quindi il programma stamperà la stampa ('Ciao da padre', os.getpid(), newpid). Tuttavia, dopo di ciò, stampa la riga dal bambino piuttosto che chiedere un input poiché il caso è dopo l'istruzione if.

Il processo figlio viene chiamato perché ora sono in esecuzione due processi. Uno chiamava la funzione child(), l'altra chiamata la funzione print. Stanno semplicemente combattendo per la stampa sullo schermo, e in questo caso hai visto la stampa genitore "vincere".

3: Che cosa fa os._exit (0)?

vedere qui: https://docs.python.org/2/library/os.html#os._exit

uscire dal processo con lo status di n, senza chiamare prima funzioni di pulizia, vampate di calore buffer di stdio, etc.

+0

Quindi, la riga 'newpid = os.fork()' non viene eseguita sullo stesso processo ('parent()')? –

+0

Aggiornato la mia risposta - sì os.fork viene eseguito sullo stesso processo del genitore. –

+0

Ok, quindi ho preso la parte bambino, tuttavia, la mia domanda rimane la stessa: 'newpid = os.fork()' viene eseguito sullo stesso processo di 'os.fork()' di 'print ('Hello from parent ', os.getpid(), newpid) '. Allora, perché 'newpid' mostra valori diversi? –

2
  1. Perché il vostro processo padre ha sempre lo stesso PID fintanto che corre (while True:).
  2. Il bambino è in realtà una copia del genitore. Questo è ciò che fa os.fork! E la funzione restituisce il pid del bambino al genitore. Quindi il genitore esegue la seconda parte dello stato-if else, mentre tutti i child eseguono la prima parte, perché os.fork per i processi figlio restituisce 0.
  3. os._exit è essenzialmente una versione ridotta di os.exit() ed è destinato ai processi figlio.
+0

Allora, perché 'newpid' mostra valori diversi? Non è quello che viene eseguito nello stesso processo? –