use File::Temp qw(tempfile);
use Inline 'C';
open my $olderr, '>&STDERR'; # save STDERR
my ($fh, $fn) = tempfile();
open STDERR, '>&', $fh;
printf "fileno STDERR: %d\n", fileno(STDERR);
print STDERR "foo!";
test_err();
open STDERR, '>&', $olderr; # reset STDERR
close $fh;
open my $e, '<', $fn;
my $err = <$e>;
print "|$err|\n";
__END__
__C__
void test_err() {
FILE *err = fdopen(2, "a+");
(void)fprintf (err, "ERROR");
}
# here it says:
# fileno STDERR: 2
# |foo!|
# ERROR
####
use strict;
use warnings;
use Inline 'C';
test_err();
__END__
__C__
#define xstr(s) str(s)
#define str(s) #s
void test_err() {
(void)fprintf(stderr, "ERROR goes to " xstr(stderr) "\n");
}
# here, it outputs:
# ERROR goes to (*(*Perl_IStdIO_ptr(((PerlInterpreter *)Perl_get_context())))->pStderr)((*Perl_IStdIO_ptr(((PerlInterpreter *)Perl_get_context()))))
####
open my $olderr, '>&STDERR'; # save STDERR
my ($fh, $fn) = tempfile();
open STDERR, '>&', $fh;
printf "fileno STDERR: %d\n", fileno(STDERR);
print STDERR "foo!";
test_err();
system "perl -e die";
open STDERR, '>&', $olderr; # reset STDERR
close $fh;
open my $e, '<', $fn;
my $err = <$e>;
print "|$err|\n";
__END__
__C__
void test_err() {
FILE *err = fdopen(2, "a+");
(void)fprintf (err, "ERROR");
}
# fileno STDERR: 2
# |foo!Died at -e line 1.
# |
# ERROR