Perl - Win32 - ¿Cómo hacer una lectura sin bloqueo de un identificador de archivo de otro proceso?

StackOverflow https://stackoverflow.com/questions/141332

Pregunta

Estoy escribiendo un código de servidor que habla con un proceso del cliente a través de STDIN. Estoy intentando escribir un fragmento de código perl que recibe de forma asíncrona las respuestas del STDOUT del cliente. La versión de bloqueo del código podría tener este aspecto:

sub _read_from_client
{
   my ($file_handle) = @_;
   while (my $line = <$file_handle>) {
      print STDOUT $line;
   }
   return;
}

Es importante destacar que el fragmento de código debe funcionar en la plataforma Win32. Hay muchas soluciones para las plataformas * nix que no me interesan. Estoy usando ActivePerl 5.10.

¿Fue útil?

Solución

Este hilo en Perlmonks sugiere que puede hacer un socket sin bloqueo en Windows en Perl de esta manera:

ioctl($socket, 0x8004667e, 1);

Más detalles y recursos en ese hilo

Otros consejos

Si no quieres ir a la ruta de bajo nivel, tendrás que buscar otras soluciones más enmarcadas.

Puede usar un hilo para leer de la entrada y hacer que rellene toda la información lee en un Thread :: Queue que luego manejas en tu hilo principal.

Puede consultar POE que implementa un marco basado en eventos, especialmente POE :: Wheel :: Run :: Win32 . Potencialmente, también puede robarle el código para implementar las lecturas sin bloqueo usted mismo.

Puedes ver [Coro], que implementa un sistema cooperativo de multitarea usando coroutines. Esto es principalmente similar a los subprocesos, excepto que obtiene subprocesos del espacio de usuario, no subprocesos del sistema.

No ha indicado hasta dónde desea ir, pero su elección es entre sysread y un marco, o escribir dicho marco usted mismo. La ruta más fácil para ir es usar hilos o pasar por el código de Poe :: Wheel :: Run :: Win32 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top