2009-12-17 20 views
13

No estoy seguro de si utilizar pty.fork() o os.fork() al generar procesos de fondo externos desde mi aplicación. (Como los motores de ajedrez)Python: cuándo usar pty.fork() contra os.fork()

Quiero que los procesos engendrados mueran si se mata al padre, como con las aplicaciones de desove en un terminal.

¿Cuáles son los altibajos entre las dos horquillas?

Respuesta

10

El proceso secundario creado con os.fork() hereda stdin/stdout/stderr del proceso primario, mientras que el hijo creado con pty.fork() está conectado a un nuevo pseudo-terminal. Necesita el último cuando escribe un programa como xterm: pty.fork() en el proceso principal devuelve un descriptor para controlar el proceso del terminal del niño, para que pueda representar visualmente los datos del mismo y traducir las acciones del usuario en secuencias de entrada del terminal.

Actualización:

De pty (7) página hombre:

Un proceso que espera para ser conectado a un terminal, puede abrir termina el esclavo de un pseudo-terminal y entonces sea impulsado por un programa que tiene abrió el final maestro. Cualquier cosa que está escrita en el extremo maestro es proporcionada al proceso en el extremo esclavo como si hubiera sido ingresada en un terminal. Por ejemplo, escribiendo el carácter de interrupción (por lo general control-C) al dispositivo maestro causaría una señal de interrupción (SIGINT) para ser generado para el grupo de proceso en primer plano que es conectado al esclavo. Por el contrario, cualquier cosa que se escriba en el extremo esclavo del pseudo-terminal puede ser leído por el proceso que es conectado al extremo maestro.

+0

Entonces, ¿el propósito del juego es mantener al niño IO en una caja separada, en lugar de mezclarlo con los padres stdin/out? Supongo que podrías hacer lo mismo con os.fork y algunos pibes. ¿Este terminal hace algo más que IO? –

+0

Claro, puedes implementar 'pty.fork()' usando 'pty.openpty()' y 'os.fork()' (en realidad puedes verlo en la fuente 'pty.py'). Pero los pseudo-terminales difieren de los tubos, ver http://en.wikipedia.org/wiki/Pseudo_terminal. –

+0

En pty.py veo que incluso el código no os.forkpty en pty.fork usa el dispositivo/dev/pty, por lo que debe haber más que solo un paradigma de entrada/salida. Leí los comentarios en la parte superior del archivo y dicen: "Errores: no se maneja la señal. No establece termios esclavos y tamaño de ventana". Wikipedia no dijo nada sobre que pty esté haciendo algo así ... –

3

En el pasado, siempre he usado el módulo subprocess para esto. Proporciona una buena API para comunicarse con subprocesos.

Puede usar call(*popenargs, **kwargs) para bloquear la ejecución de ellos, y creo que el uso de la clase Popen puede manejar la ejecución asincrónica.

Consulte docs para obtener más información.

En cuanto al uso de os.fork frente a pty.fork, ambos dependen en gran medida de la plataforma, y ​​ninguno de ellos funcionará (o al menos se probará) con Windows. El módulo pty parece ser el más limitado de los dos al leer los documentos. La principal diferencia es el aspecto pseudo terminal. Entonces, si no está dispuesto a diseñar su código de forma tal que pueda usar el módulo subprocess, probablemente vaya con os.fork en lugar de pty.fork.

+0

En realidad, es exactamente el "aspecto pseudo terminal" del que me gustaría obtener más información. He leído muchos de los documentos y mans del kernel, pero no he descubierto exactamente cuándo se supone que debo usar witch ... –

+0

De la lectura que he hecho se trata de poder hacer entrada/salida a la terminal del proceso a través del código. Así que esto me suena como un paradigma separado de usar stdout/stdin para comunicarse con la aplicación. Más información sobre el concepto de pseudo-terminal aquí: http://en.wikipedia.org/wiki/Pseudo_terminal –

+0

Cuando leo en wikipedia, las costuras pseudo-terminales son solo una alternativa a las tuberías. Cuando dices 'hacer entrada/salida por código', ¿te refieres a cosas como eliminar e insertar, o solo lectura/escritura estándar como un tubo? –

2

Pseudotermials son necesarios para algunas aplicaciones que realmente esperan un terminal. Un shell interactivo es uno de estos ejemplos, pero hay muchos otros. La opción pty.fork no está allí como otro os.fork sino como una API específica para usar un pseudoterminal.

Cuestiones relacionadas