Какой межплатформенный модуль IPC Perl является предпочтительным?

я хочу создать простой объект ввода-вывода, представляющий канал, открытый для другой программы, в который я могу периодически записывать в STDIN другой программы во время работы моего приложения. Я хочу он должен быть пуленепробиваемым (в том смысле, что он улавливает все ошибки) и кросс-платформенным.Лучшие варианты, которые я могу найти:

открытый

sub io_read {
    local $SIG{__WARN__} = sub { }; # Silence warning.
    open my $pipe, '|-', @_ or die "Cannot exec $_[0]: $!\n";
    return $pipe;
}

Преимущества:

  • Кросс-платформенный
  • Простой

Недостатки

  • Нет $SIG{PIPE}для перехвата ошибок из конвейерная программа
  • Обнаружены ли другие ошибки?

IO::Pipe

sub io_read {
    IO::Pipe->reader(@_);
}

Преимущества:

  • Простой
  • Возвращает объект IO::Handle для объектно-ориентированного интерфейса
  • Поддерживается ядром Perl.

Недостатки

  • По-прежнему нет $SIG{PIPE}для перехвата ошибок из конвейерной программы
  • Не поддерживается в Win32 (или, по крайней мере, его тестыпропускаются )

IPC::Run

В IPC::Run нет интерфейса для записи в дескриптор файла, только добавление к скаляру. Это кажется… странным.

IPC::Run3

Здесь также нет интерфейса дескриптора файла. Я мог бы использовать ссылку на код, которая будет вызываться повторно для спулинга дочернему элементу, но глядя на исходный код, оказывается, что он на самом деле записывает во временный файл, а затем открывает его и спулирует егосодержимое. к команде pipe'd STDIN. Что?

IPC::Cmd

По-прежнему нет интерфейса дескриптора файла.


Что я здесь упускаю? Кажется, что это должна быть решенная проблема, и я немного ошеломлен, что это не так. IO::Pipe ближе всего подходит к тому, что я хочу, но отсутствие обработки ошибок $SIG{PIPE}и отсутствие поддержки Windows огорчают. Где модуль трубопровода, который будет использовать JDWIM?

16
задан theory 13 May 2012 в 06:50
поделиться