Perl - Win32 - Come eseguire una lettura non bloccante di un filehandle da un altro processo?

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

Domanda

Sto scrivendo del codice server che comunica con un processo client tramite STDIN. Sto provando a scrivere un frammento di codice perl che riceve in modo asincrono le risposte dallo STDOUT del client. La versione bloccante del codice potrebbe apparire così:

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

È importante sottolineare che lo snippet deve funzionare nella piattaforma Win32. Esistono molte soluzioni per le piattaforme * nix che non mi interessano. Sto utilizzando ActivePerl 5.10.

È stato utile?

Soluzione

Questa discussione su Perlmonks suggerisce che puoi creare un socket senza blocco su Windows in Perl in questo modo:

ioctl($socket, 0x8004667e, 1);

Maggiori dettagli e risorse in quel thread

Altri suggerimenti

Se non vuoi seguire la strada di basso livello, dovrai guardare le altre soluzioni più strutturate.

Puoi usare un thread per leggere dall'input e fare in modo che riempia tutti i dati legge in un Thread :: Queue che poi gestisci nel tuo thread principale.

Puoi guardare POE che implementa un framework basato su eventi, in particolare POE :: Wheel :: Run :: Win32 . Potenzialmente, puoi anche rubare il codice da esso per implementare le letture di non blocco.

Puoi guardare [Coro], che implementa un sistema multitasking cooperativo usando coroutine. Questo è per lo più simile ai thread, tranne per il fatto che si ottengono thread spazio utente, non thread di sistema.

Non hai dichiarato fino a che punto vuoi andare, ma la tua scelta è tra sysread e un framework, o scrivendo tu stesso tale framework. Il percorso più semplice da percorrere è solo usare i thread o scorrere il codice di Poe :: Wheel :: Run :: Win32 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top