IO :: Выбрать и добавить тег в дескриптор - PullRequest
2 голосов
/ 08 апреля 2020

Мне интересно, как лучше добавить дополнительные данные в дескриптор, когда я использую IO :: Select?

В основном я хотел бы добавить дескриптор в IO :: Select, но также к этому дескриптору прикреплена дополнительная информация, которую я мог бы получить позже.

Примечание: я знаю, что мог бы сохранить отдельную структуру данных, которая содержит дескриптор и дополнительные данные, но для этого потребовалась бы координация двух структур данных, и это, вероятно, вызвать больше проблем, чем стоит.

1 Ответ

6 голосов
/ 08 апреля 2020

Прямой путь следует из IO :: Select документов для add метода

Каждый дескриптор может быть объектом IO :: Handle, целым числом или ссылкой на массив где первый элемент - это IO :: Handle или целое число.

Итак, есть «ссылка на массив», которую можно использовать.

Пример:

use warnings;
use strict;
use feature 'say';

use Time::HiRes qw(sleep);
use POSIX qw(:sys_wait);
use IO::Select;

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

my @procs;
for my $job (1..3) {
    pipe my ($reader, $writer);
    $sel->add( [$reader, "job-$job"] );  # add a tag to the handle

    my $pid = fork // die "can't fork: $!";

    if ($pid == 0) {
        close $reader;
        sleep rand 4;
        say $writer "\thi from $$ (job $job)";
        close $writer;
        exit; 
    }   
    close $writer;
    push @procs, $pid;
}       
say "Started processes @procs\n";

# Read from pipes when ready, print piped messages
while ( my @ready = $sel->can_read ) {
    foreach my $p (@ready) {
        my ($handle, $tag) = @$p;
        say "Reading from fileno ", $handle->fileno, ", tag: ", $tag;
        print while <$handle>;
        $sel->remove($p);      # *this* order: remove then close
        close $handle;
    }   
}   

# Reap
my $msg = "\nExited (with status): ";
my $kid = 0; # poll to reap
while (($kid = waitpid -1, WNOHANG) > -1) {
    $msg .= "$kid ($?) " if $kid > 0; 
    sleep 0.01;
}   
say $msg;

Отпечатки

Started processes 15679 15680 15681

Reading from fileno 5, tag: job-2
        hi from 15680 (job 2)
Reading from fileno 4, tag: job-1
        hi from 15679 (job 1)
Reading from fileno 6, tag: job-3
        hi from 15681 (job 3)

Exited (with status): 15680 (0) 15679 (0) 15681 (0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...