freopen on both stdout and stderr

Discussion in 'C Programming' started by Guillaume Dargaud, Nov 23, 2007.

  1. Hello all,
    a while ago I was pointed towards freopen as a way to redirect stderr to a
    log file. It works great, but apparently the app also writes a few lines to
    stdout. Now I could redirect to 2 separate files, but would rather keep the
    2 flows together.

    Is it correct to do this:
    stderr=freopen(LogFile, "w", stderr);
    stdout=freopen(LogFile, "a", stdout);

    I can see plenty of reasons why it would fail (buffering and flushes come to
    mind).
    Any advice ?
    --
    Guillaume Dargaud
    http://www.gdargaud.net/Climbing/
    "Faith can move mountains but let them happily fall down on the heads of
    other people. What's the point in moving mountains when it's so simple to
    climb over them ?" - Boris Vian, surrealist French writer and singer, En
    verve.
     
    Guillaume Dargaud, Nov 23, 2007
    #1
    1. Advertising

  2. Guillaume Dargaud

    Mark Bluemel Guest

    Guillaume Dargaud wrote:
    > Hello all,
    > a while ago I was pointed towards freopen as a way to redirect stderr to a
    > log file. It works great, but apparently the app also writes a few lines to
    > stdout. Now I could redirect to 2 separate files, but would rather keep the
    > 2 flows together.
    >
    > Is it correct to do this:
    > stderr=freopen(LogFile, "w", stderr);
    > stdout=freopen(LogFile, "a", stdout);


    It's not in accordance with the standard to do this, as "stderr" and
    "stdout" are not, as I recall, guaranteed to be lvalues...

    If you can assign them, and you're prepared to accept non-portability,
    then you could perhaps try the following, untested, hackery

    stderr=freopen(LogFile, "w", stderr);
    fclose(stdout);
    stdout=stderr;

    Otherwise, I'm not convinced you have many options available to you.
     
    Mark Bluemel, Nov 23, 2007
    #2
    1. Advertising

  3. Guillaume Dargaud

    Flash Gordon Guest

    Mark Bluemel wrote, On 23/11/07 12:01:
    > Guillaume Dargaud wrote:
    >> Hello all,
    >> a while ago I was pointed towards freopen as a way to redirect stderr
    >> to a log file. It works great, but apparently the app also writes a
    >> few lines to stdout. Now I could redirect to 2 separate files, but
    >> would rather keep the 2 flows together.
    >>
    >> Is it correct to do this:
    >> stderr=freopen(LogFile, "w", stderr);
    >> stdout=freopen(LogFile, "a", stdout);

    >
    > It's not in accordance with the standard to do this, as "stderr" and
    > "stdout" are not, as I recall, guaranteed to be lvalues...
    >
    > If you can assign them, and you're prepared to accept non-portability,
    > then you could perhaps try the following, untested, hackery
    >
    > stderr=freopen(LogFile, "w", stderr);
    > fclose(stdout);
    > stdout=stderr;
    >
    > Otherwise, I'm not convinced you have many options available to you.


    Personally I would use a mechanism outside the program in order to
    achieve this and not redirect either stdout or stderr within the
    program. E.g.
    prog >log 2>&1
    The precise mechanism (and whether it is even possible) is dependant on
    the system being used.
    --
    Flash Gordon
     
    Flash Gordon, Nov 23, 2007
    #3
  4. Flash Gordon wrote:
    [...]
    > Personally I would use a mechanism outside the program in order to
    > achieve this and not redirect either stdout or stderr within the
    > program. E.g.
    > prog >log 2>&1
    > The precise mechanism (and whether it is even possible) is dependant on
    > the system being used.


    That's fine if you want to redirect stderr and stdout to the same place
    for the entire run of the program. If you want to redirect it only for
    part of the program, it's more difficult.

    --
    Keith Thompson (The_Other_Keith)
    Looking for software development work in the San Diego area.
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Nov 23, 2007
    #4
  5. Guillaume Dargaud

    santosh Guest

    In article <fi7994$1j5$>, Keith Thompson <> wrote
    on Saturday 24 Nov 2007 12:52 am:

    > Flash Gordon wrote:
    > [...]
    >> Personally I would use a mechanism outside the program in order to
    >> achieve this and not redirect either stdout or stderr within the
    >> program. E.g.
    >> prog >log 2>&1
    >> The precise mechanism (and whether it is even possible) is dependant
    >> on the system being used.

    >
    > That's fine if you want to redirect stderr and stdout to the same
    > place for the entire run of the program. If you want to redirect it
    > only for part of the program, it's more difficult.


    As far as I can see, the only fully portable solution is to design the
    program from the ground up in such a way that all I/O functions take
    explicit stream parameters instead of being hard-wired to a particular
    stream.

    Also when stdout is redirected there is no way to recover the path to
    the original device.
     
    santosh, Nov 24, 2007
    #5
  6. On Nov 23, 6:01 am, Mark Bluemel <> wrote:
    > Guillaume Dargaud wrote:
    > > Hello all,
    > > a while ago I was pointed towards freopen as a way to redirect stderr to a
    > > log file. It works great, but apparently the app also writes a few lines to
    > > stdout. Now I could redirect to 2 separate files, but would rather keep the
    > > 2 flows together.

    >
    > > Is it correct to do this:
    > > stderr=freopen(LogFile, "w", stderr);
    > > stdout=freopen(LogFile, "a", stdout);

    >
    > It's not in accordance with the standard to do this, as "stderr" and
    > "stdout" are not, as I recall, guaranteed to be lvalues...
    >
    > If you can assign them, and you're prepared to accept non-portability,
    > then you could perhaps try the following, untested, hackery
    >
    > stderr=freopen(LogFile, "w", stderr);
    > fclose(stdout);
    > stdout=stderr;
    >
    > Otherwise, I'm not convinced you have many options available to you.


    N1256 seems to specify that, on success, freopen() just returns its
    third argument, so there'd be no need to assign the result to stdout/
    stderr when passing them as the stream. There's even a footnote:

    "The primary use of the freopen function is to change the file
    associated with a standard text stream (stderr, stdin, or stdout), as
    those identifiers need not be modifiable lvalues to which the value
    returned by the fopen function may be assigned."
     
    Justin Spahr-Summers, Nov 24, 2007
    #6
  7. "Guillaume Dargaud" <> a
    écrit dans le message de news: fi6eo6$um6$2p3.fr...
    > Hello all,
    > a while ago I was pointed towards freopen as a way to redirect stderr to a
    > log file. It works great, but apparently the app also writes a few lines
    > to stdout. Now I could redirect to 2 separate files, but would rather keep
    > the 2 flows together.
    >
    > Is it correct to do this:
    > stderr=freopen(LogFile, "w", stderr);
    > stdout=freopen(LogFile, "a", stdout);


    Do not store the result of freopen into stderr or stdout, just check that it
    is not NULL.
    In order to preserve proper flows for both streams, you should make both
    unbuffered via setvbuf.
    You might also want to first create the LogFile, and then freopen both
    streams in append mode.

    --
    Chqrlie.
     
    Charlie Gordon, Nov 26, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alex Vinokur

    freopen, fclose and stdout

    Alex Vinokur, Dec 3, 2003, in forum: C Programming
    Replies:
    4
    Views:
    8,375
    vidyaani
    Jan 11, 2013
  2. Vincent Touquet
    Replies:
    1
    Views:
    589
    Adrian B.
    Sep 3, 2004
  3. Vincent  Touquet
    Replies:
    0
    Views:
    443
    Vincent Touquet
    Sep 6, 2004
  4. tmpfile and freopen

    , Jun 5, 2006, in forum: C Programming
    Replies:
    1
    Views:
    368
    Barry Schwarz
    Jun 15, 2006
  5. Michel Albert
    Replies:
    5
    Views:
    1,402
    Daniel Dehennin
    Oct 24, 2012
Loading...

Share This Page