Я хочу создать простой объект ввода-вывода, представляющий канал, открытый для другой программы, который я могу периодически записывать в другую программу STDIN по мере запуска моего приложения. Я хочу, чтобы он был пуленепробиваемым (в том смысле, что он ловит все ошибки) и кросс-платформенный. Лучшие варианты, которые я могу найти, это:
open
sub io_read {
local $SIG{__WARN__} = sub { }; # Silence warning.
open my $pipe, '|-', @_ or die "Cannot exec $_[0]: $!\n";
return $pipe;
}
Преимущества:
- Кросс-платформенная
- Простой
Недостатки
- Нет
$SIG{PIPE}
, чтобы уловить ошибки в программе с каналами - Устранены другие ошибки?
IO:: Труба
sub io_read {
IO::Pipe->reader(@_);
}
Преимущества:
- Простой
- Возвращает объект IO:: Handle для интерфейса OO
- Поддерживается ядром Perl.
Недостатки
- По-прежнему нет
$SIG{PIPE}
, чтобы уловить ошибки в программе с каналами - Не поддерживается Win32 (или, по крайней мере, его тесты пропущены)
IPC:: Run
Нет интерфейса для записи в дескриптор файла в IPC:: Run, только добавление к скаляру. Это кажется... странным.
IPC:: RUN3
Здесь нет интерфейса дескриптора файлов. Я мог бы использовать ссылку на код, которая будет вызываться многократно для передачи ролику ребенку, но, глядя на исходный код, кажется, что он фактически записывает во временный файл, а затем открывает его и направляет его содержимое команде pipe'd STDIN
. Wha?
IPC:: Cmd
Интерфейс дескриптора без файлов.
Что мне здесь не хватает? Кажется, что это должна быть проблема, и я ошеломлен, что это не так. IO:: Pipe ближе всего к тому, что я хочу, но отсутствие обработки ошибок $SIG{PIPE}
и отсутствие поддержки для Windows вызывает беспокойство. Где модуль трубопроводов, который будет JDWIM?