2012-02-26 12 views
6

Tengo un programa en C que llama a fork()Obtener el stdout/stderr de un proceso en forma de horquilla en un subproceso

Y tengo un script en Python que ejecuta el programa C con

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0) 

Ahora puedo leer de salida estándar y stderr con child.stderr.read(1) o child.communicate(), ... Pero mi problema es ahora, ¿cómo puedo obtener solamente la salida del bifurcó proceso. ¿Esto es posible? ¿Puedo obtener el pid de ambos, el programa C original y el tenedor?

saludos cordiales, muchas gracias :)

Fabian

+0

"¿Esto es posible?" No. "¿Puedo obtener el pid de ambos, el programa C original y el tenedor?" No. El programa C posee ese niño. Su proceso posee el programa C. Ahora. Deja de preocuparte por los detalles de Linux y describe tu problema ** real **. ¿Por qué su programa Python no puede ejecutar el mismo subproceso que el programa C? –

+0

una forma más fácil podría ser el uso de un formato de salida diferente, el proceso principal podría comenzar con: "ParentOutput:", mientras que la salida del subproceso es: "ChildOutput:". Entonces puedes ignorar "ParentOutput" en tu programa python. – springrider

Respuesta

1

Lo que están pidiendo que va a ser complicado y no será posible en Python puro - que se necesita un poco de OS- mecanismos específicos.

Realmente estás pidiendo dos cosas:

  • identificar un proceso bifurcado desde el PID del proceso padre
  • Intercepción el estándar de entrada/salida de un proceso arbitrario

Usted Probablemente podría hacer lo anterior mediante el análisis/proc. si estuviera en Linux, este último es realmente una función de depuración (por ejemplo, How can a process intercept stdout and stderr of another process on Linux?)

Es más probable que desee cambiar la forma en que funciona su programa C; por ejemplo, hacer fork()/daemonization desde el script python en lugar del código intermedio C le permitirá obtener el proceso secundario directamente.

0

Creo que cuando bifurca() un proceso en C, no puede pasar ningún descriptor del proceso secundario a principal, pero puede ser que estoy equivocado. Solo lo que obtiene es un PID del nuevo proceso hijo. La mejor manera de hacerlo es abrir una tubería (con el nombre convencional, por ejemplo, el nombre de la tubería contiene el PID del proceso), y luego puede abrirlo desde cualquier lugar.

Por último, cuando tenedor() el proceso, se da a que el PID, y se puede escribir tanto PID (C binario y en forma de horquilla) a la salida estándar del programa en C, ejemplo, con un separador:

cpid = fork(); 
printf("%d|%d", (int)get_pid(), cpid); 

Buena suerte :)

Cuestiones relacionadas