Página 1 de 1

Problema Perl bajo Windows y procesos

NotaPublicado: 2010-10-04 10:29 @478
por julmito
Hola, estoy reescribiendo un código que provocaba que un perl.exe generara un error y se cerraba.

El objetivo de esta parte del código es ejecutar un proceso y generar los ficheros stdout.log y stderr.log. Además se lee cada 5 s la parte de stdout.log y ejecuto unas comprobaciones.

La primera vez abría con open3(), y generaba dos procesos con fork(). Creaba dos sockets; con el principal y con lectura no bloqueante comprobaba si había novedades y si las había las cargaba en el principal. Aparentemente, funcionaba bien, pero a veces, generaba un error, con el mismo proceso, aleatorio totalmente. Nada más arrancar o al terminar. Cambiando open3() y los fork(), sockets... por system(""), y perdiendo la salida, funcionaba bien.

El segundo intento, abro con open3(). Genero dos procesos con fork(), cada uno bloqueado a stdout y stderr que lo único que hacen es escribir en un fichero temporal la salida stdout/stderr. Con otro fork(), cargo la parte del fichero que se escribe cada x seg., y hago unas comprobaciones. Bajo Linux, perfecto. Bajo Windows, perl.exe ha generado un error.

El problema no sé si es por usar fork(), que veo que lo emula usando hilos, o de open3(). Lo siguiente sería usar algún módulo propio de Windows. El perl.exe he intentado depurarlo, pero no lo consigo, quitando partes de código, escribiendo texto en stdout... y no he logrado nada, mismo error y no sé exactamente en que línea.

He probado a actualizar a la última versión de Perl y de los módulos que uso, pero nada.

¿Tenéis alguna experiencia con fork() u open3 bajo Windows?

Cualquier comentario se agracederá.

Gracias y saludos.

Re: Problema Perl bajo Windows y procesos

NotaPublicado: 2010-10-04 11:15 @510
por explorer
¿Y qué error sale?

fork(), en Windows, no funcionaba igual que en los Linux, hasta hace poco, que con fondos de Micro$oft y con el desarrollo de la empresa ActiveState, se consiguió implementarlo por medio de la creación de otro proceso que comparte el mismo espacio que el proceso padre (creo que eso es lo que pone al principio de perlfork).

Si vas a las secciones CAVEATS AND LIMITATIONS y BUGS, se comenta que los open() con "|-" no están soportados, pero ofrece código alternativo.

Lo mismo pasa con IPC::Open3, que advierte que abrir a "|-" no funciona en Windows.

Ahora... sí te funciona en Linux, ¿para qué quieres romperte la cabeza con Windows? ;)

Re: Problema Perl bajo Windows y procesos

NotaPublicado: 2010-10-04 13:12 @592
por julmito
Muchas gracias por responder, Explorer, el error es como este:
Imagen
pero con el ejecutable perl.exe en lugar de basichacked.exe.

Un par de veces le di a depurar, y se abrió Visual C, pero con las instrucciones en asm, cualquiera se mete. Intentaba ver si veía algún nombre de dll o algo para tener más pistas, pero nada.

Si, cuando estaba mirando, si usaba fork() para Windows, me di cuenta que no crea dos procesos como en Linux (independientes) sino que crea un hilo (que comparten muchas zonas de la memoria para todos los hilos. No sé si en Perl fork() para Windows seguirá esta teoría de los hilos o no, pero no modifico variables).

Lo malo ha sido que funcionó bien en esas pruebas y al final, suponía que estaba haciendo algo mal...

Por lo que me comentas de open3(), fork(), buscaré algún módulo para lanzar un proceso bajo Windows y poder guardar stdout y stderr en ficheros, mientras el programa main continúa...

Y echaré un vistazo a ver si con alguna librería para abrir procesos/hilos de la API de Windows.

Lástima. Gracias, paisano.

Re: Problema Perl bajo Windows y procesos

NotaPublicado: 2010-10-04 16:37 @734
por explorer
En el hilo Función exec() y system() en Windows se comentan un par de módulos para arrancar procesos en Windows. Lo que no sé es si heredan los flujos de entrada y salida.

Re: Problema Perl bajo Windows y procesos

NotaPublicado: 2010-10-04 17:29 @770
por julmito
Gracias, mañana le echo un vistazo. He visto también IPC:Run3, pero realmente no sé cómo ejecutará un proceso bajo Windows. Ya lo leeré.

Un saludo