Ответ 1
От perldoc -f open:
open STDOUT, '>', "foo.out"
Документы - ваш друг...
Я ищу пример перенаправления stdout в файл с помощью Perl. Я делаю довольно простой инструмент fork/exec, и я хочу перенаправить вывод child в файл вместо stdout для родителей.
Есть ли эквивалент dup2()
, который я должен использовать? Я не могу найти его
От perldoc -f open:
open STDOUT, '>', "foo.out"
Документы - ваш друг...
Сам ребенок может сделать select $filehandle
, чтобы указать, что все его вызовы print
должны быть направлены на конкретный дескриптор файла.
Лучшее, что может сделать родитель, это использовать system
или exec
или что-то подобное для перенаправления оболочки.
Как сказал JS Bangs, простым способом перенаправления вывода является использование оператора "select".
Большое спасибо stackoverflow и их пользователям. Надеюсь, это полезно.
например:
print "to console\n";
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!";
select OUTPUT; $| = 1; # make unbuffered
print "to file\n";
print OUTPUT "also to file\n";
print STDOUT "to console\n";
# close current output file
close(OUTPUT);
# reset stdout to be the default file handle
select STDOUT;
print "to console";
open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
open STDOUT, '>&', $fh;
# do whatever you want
...
exit;
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";
Строго информативный, но непрактичный ответ:
Хотя почти наверняка есть более элегантный способ обойти это, в зависимости от точных деталей того, что вы пытаетесь сделать, если вы абсолютно должны иметь dup2()
, его эквивалент Perl присутствует в модуле POSIX
. Однако в этом случае вы имеете дело с фактическими файловыми дескрипторами, а не с файловыми файлами Perl, и, соответственно, вам запрещено использовать другие предоставленные функции в модуле POSIX, все из которых аналогичны тому, что вы использовали бы на C. в какой-то степени вы бы написали C в очень не Perlish Perl.