[linux] stderr pipe redirection, buffering

Pavol Kucerak kucerak na ppa.sk
Čtvrtek Červen 7 15:13:01 CEST 2007


Pozdravujem vás mám otáazku.
Mám takýto príklad s presmerovanim, na Cygwin na XP:

#include <stdio.h>
int main(int argc, char **argv)
{
    int n = 10;
    int i =  0;
    int ierr = 1;

    for(i=1; i<= n; i++) {
        fprintf(stdout, "Line output n.%2d to stdout\n",i);
        if(i == (n/2)) {
            fprintf(stderr, "Line output n.%2d to stderr\n",ierr);
            ierr++;
        }
    }
    return 0;
}

Skompilujme s gcc, nazvime ho testStd.

pri spusteni:

$ ./testStd.exe
Line output n. 1 to stdout
Line output n. 2 to stdout
Line output n. 3 to stdout
Line output n. 4 to stdout
Line output n. 5 to stdout
Line output n. 1 to stderr
Line output n. 6 to stdout
Line output n. 7 to stdout
Line output n. 8 to stdout
Line output n. 9 to stdout
Line output n.10 to stdout

pri spusteni s presmerovanim stderr do stdout a potom cez pipe:

$ ./testStd.exe 2>&1 | cat -n
     1  Line output n. 1 to stderr
     2  Line output n. 1 to stdout
     3  Line output n. 2 to stdout
     4  Line output n. 3 to stdout
     5  Line output n. 4 to stdout
     6  Line output n. 5 to stdout
     7  Line output n. 6 to stdout
     8  Line output n. 7 to stdout
     9  Line output n. 8 to stdout
    10  Line output n. 9 to stdout
    11  Line output n.10 to stdout

Otázka. Prečo je to tak?  Urobí tak isto v linuxe?
Záleží to od rôzneho bufrovania stdout a stderr?
Dá sa urobiť tak, aby sa poradie výstupov nezmenilo? Pomocou setvbuf?
Dá sa zistiť ako je nastavené bufrovanie? Ďakujem.

P.Kučerák




Další informace o konferenci linux