Можно ли смешивать именованный канал с select в perl? - PullRequest
2 голосов
/ 07 июня 2010

Мне нужно написать демон, который должен иметь один сокет TCP и один именованный канал.Обычно, если мне нужно реализовать сервер с несколькими IO с «чистыми» сокетами, я всегда выберу модель на основе нескольких IO.так же кто-нибудь из вас когда-либо использовал именованный канал в select или вы можете просто сказать мне, что это невозможно.заранее спасибо.

1 Ответ

8 голосов
/ 07 июня 2010

Одним словом, да:

#!/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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...