ОБНОВЛЕНИЕ : что касается ваших комментариев, Ильмари Каронен уже объяснил вам, что канал не имеет размера файла, потому что это поток данных, программа не знает, насколько большим может быть этот поток.
У вас две проблемы: ваша C-программа не работает, а также ваша Perl-программа не работает, потому что она зашла в тупик.Вы не можете проверить две вещи вместе.Разделите две проблемы.Например, сначала попробуйте свою программу с каналом из оболочки.
cat sample.xml | ./a.out
Size is 60
Первоначально она не работала.Чтобы это работало, я использовал эту модифицированную программу на C: размер можно рассчитать по потоку, посчитав все полученные символы до EOF.
#include <stdio.h>
int main (){
long size = 0;
int ch;
FILE *file = stdin;
if (!file) {
return 2;
}
while ((ch = getc(file)) != EOF) {
++size;
}
printf("Size is %ld\n", size);
fprintf(stderr, "%d", 1);
return 0;
}
Что касается вашей Perl-программы, у вас был тупик, потому что обе программынаходились в состоянии ожидания, чтобы решить его, я немного изменил порядок инструкций:
#!/usr/bin/perl -w
use strict;
use IPC::Open2;
open FILE, "sample.xml" or die $!;
my @xmlfile = <FILE>;
my $pid = open2(*Reader, *Writer, './a.out 2> /dev/null');
print Writer @xmlfile;
close(Writer);
my @got = <Reader>;
close(Reader);
waitpid($pid, 0);
print "Output got is: ";
print @got;
Как вы можете видеть, я закрываю писатель перед тем, как начать читать, потому что моя программа на C предназначена для получениявсе ввод, а затем сделать вывод.И теперь все межпроцессное взаимодействие будет работать:
./program.pl
Output got is: Size is 60
В качестве примечания вам не нужно закрывать $ pid, поскольку это просто число, представляющее идентификатор процесса дочернего элемента.В других случаях вы можете изучить неблокирующие операции чтения , но это усложнит логику.
ОРИГИНАЛЬНЫЙ ОТВЕТ : не удалось решить проблему с постером, потому что онхотел использовать IPC.
Можете ли вы просто добавить имя файла как sample.xml к $ cmd?Вы можете просто использовать оператор backtick для захвата вывода, chomp удаляет символ новой строки и вывод будет в $ out.
#!/usr/bin/perl
$cmd = './a.out < sample.xml 2> /dev/null';
$out = `$cmd`;
chomp $out;
print "out='$out'\n";
Я думаю, что ваш пример - найти способ связи между C и Perlпотому что, конечно, если это просто размер файла, то в Perl все гораздо проще:
#!/usr/bin/perl
print -s 'sample.xml';
print "\n";