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