2010-06-07 112 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

相关问题