2011-05-18 8 views
6

Sección 17.1.4.2: Replacing shell pipeline del módulo Python subproceso dice para reemplazarExplicar ejemplo de pitón subproceso módulo

output=`dmesg | grep hda` 

con

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 

El comentario a la tercera línea explica por qué la función de cierre está siendo llamados, no por qué tiene sentido. No, para mí. ¿No se cerrará p1.stdout antes de que se llame al método de comunicación para evitar que se envíe la salida a través de la tubería? (Obviamente no, he intentado ejecutar el código y funciona bien). ¿Por qué es necesario llamar cerca para que p1 reciba SIGPIPE? ¿Qué tipo de cerca es que no se cierra? ¿Qué, exactamente, se está cerrando?

Por favor, considere esta una cuestión académica, no estoy tratando de lograr nada, excepto la comprensión de estas cosas mejor.

+0

stdin y stdout son archivos. Entonces se supone que debes cerrarlos para liberar la tubería. – JBernardo

Respuesta

10

Está cerrando p1.stdout en el proceso principal, dejando así dmesg como el único proceso con ese descriptor de archivo abierto. Si no lo hizo, incluso cuando dmesg cerró su stdout, aún lo tendría abierto, y no se generaría un SIGPIPE. (El sistema operativo básicamente mantiene un recuento de referencias y genera SIGPIPE cuando llega a cero. Si no cierra el archivo, evita que llegue a cero).

Cuestiones relacionadas