2010-06-07 43 views
2

我需要編寫一個應該有一個TCP套接字和一個命名管道的守護進程。通常,如果我需要使用「純」套接字來實現多IO服務器,那麼基於選擇的多IO模型總是我會選擇的模型。所以你們中的任何人都曾經使用過命名管道,或者你可以告訴我這是不可能的。提前致謝。是否可以在Perl中混合使用select命名的管道?

回答

8

總之一句話,是:

#!/usr/bin/perl 

use strict; 
use warnings; 

use POSIX qw/mkfifo/; 
use IO::Select; 
use IO::Handle; 

my $filename = "/tmp/pipe.$$"; 

mkfifo $filename, 0700 
    or die "could not create pipe $filename: $!"; 

die "could not fork\n" unless defined(my $pid = fork); 
unless ($pid) { 
    open my $fh, ">", $filename 
     or die "could not open $filename\n"; 

    my $i = 1; 
    for (1 .. 10) { 
     sleep 1; 
     print $fh $i++, "\n"; 
     $fh->flush; 
    } 
    exit; 
} 

my $s = IO::Select->new; 

open my $fh, "<", "$filename" 
    or die "could not open $filename\n"; 

$s->add($fh); 

OUTER: while (1) { 
    print localtime() . "\n"; 
    my @files = $s->can_read(.25); 
    if (@files) { 
     for my $fh (@files) { 
        my $line = <$fh>; 
      print "from pipe: $line"; 
      last OUTER if $line == 10; 
     } 
    } 
} 
+4

這隻要你不是在Windows系統上的工作原理。 Win32'select'只適用於實際的網絡套接字。 – daotoad 2010-06-07 04:28:09

相關問題