Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^4: STDERR going to string

by philkime (Sexton)
on Oct 11, 2011 at 08:21 UTC ( #930761=note: print w/ replies, xml ) Need Help??


in reply to Re^3: STDERR going to string
in thread STDERR going to string

It's not really the output of an external command etc. I need. It's the STDERR of a C library which an XS module uses. So when I make certain sub calls, it gets into the C routines and it's their STDERR I want to capture. It all works fine on non-Windows using STDERR redirection to a file or Capture::Tiny but on Windows, the STDERR of the library refuses to be captured. This seems to be a windows specific thing - I read somewhere that re-opening STDERR on windows de-couples perl STDERR from the C library STDERR. If so, I'm really in the dark as to how to capture this.


Comment on Re^4: STDERR going to string
Re^5: STDERR going to string
by Anonymous Monk on Oct 11, 2011 at 09:06 UTC

    ...repetitive...I'm really in the dark as to how to capture this.

    Like I already said, launch a process

    perl foo.pl 1>my.stdout.txt 2>my.stderr.txt always works

      I don't think I understand how to do that in my case. I am in the middle of a large program and need to make some sub calls to some XS/external lib subs. There isn't anything I can really launch as an external processs here. Am I missing something? I know it'll always work if I redirect everything before I start but my problem is that I am already deep in some code at the point where I need to run some XS subs and get their STDERR.

        Am I missing something?

        $ perl -le " print for map { fileno $_ } \*STDIN, \*STDOUT, \*STDERR +" 0 1 2

        There is nothing you can do to change the fileno of STDIN/STDOUT/STDERR on a c-level on win32, they're always 0 1 2, so any c code printing on STDERR is printing on 2, always

        To capture STDERR you have to launch a process, or

        Patch XS module to use perl functions for printing to stderr (perlclib), so that when you redirect STDERR/STDOUT (like using IO::NestedCapture), it notices

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://930761]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2015-07-04 17:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (60 votes), past polls