← Back to team overview

sslug-teknik team mailing list archive

Re: Usædvanlig(?) omdirigering af uddata

 

In <7g64v5zv0c.fsf@xxxxxxxxxxxxxxxx> Henrik Christian Grove <grove@xxxxxxxx> writes:

>Jeg har et program (faktisk flere, men det er ligegyldigt) der
>producerer en del uddata på stdout og også lidt på stderr.

>Jeg vil gerne kunne se det der kommer på stderr, men jeg vil samtidig
>gerne have begge dele ned i én fil, så jeg, hvis det bliver nødvendigt,
>kan komme til at se hvad der er sket på stdout lige op til fejlen (som
>rapporteres på stderr. Det betyder så også at begge dele skal skrives
>ned i filen løbende, så det er ikke godt nok at sende stdout til en fil
>og stderr til en anden og så sætte dem sammen bagefter. 

At dømme efter svarene er det en sjov lille opgave. Jeg tror ikke den
kan løses generelt, men det kan gøres hvis du har mulighed for at "pille" 
lidt i de programmer du kører.

For det første så duer det ikke med at redirigere stdout/stderr via shell'en
som flere har været inde på. Det bliver i al fald kringlet når det er stderr
der skal sendes til både skærmen og logfilen.

For det andet så er det et problem at stdio biblioteket buffrer stdout, men 
ikke stderr. Det betyder at selv om man får løst problemet med at redirigere
de forskellige I/O strømme til de rigtige steder, så vil du alligevel se
at stderr "overhaler" stdout, fordi programmets skrivninger til stdout bliver
buffret.

Det er her du bliver nødt til at "pille" i programmerne - hvis du har mulighed
for at slå buffring fra, kan opgaven løses. D.v.s. du skal tilføje
	setvbuf(stdout, (char *)NULL, _IOLBF, 0);
i toppen af main() på de programmer, du skal køre på denne måde.

Min løsning er et lille C program, som kan findes på 
http://www.hswn.dk/~henrik/grove/

"grove.c" bruges til at køre dine programmer med. Så du vil køre

   ./grove mitprogram --program-options >output.log

output.log får både stdout og stderr fra "mitprogram". stderr bliver
også skrevet ud på skærmen.

Samme sted ligger der "grovetest.c" som jeg brugte til aftestning.
Det skriver 100 linier til stdout, og hver 17. linie også til stderr.
Hvis det køres med "--nobuf" sætter det stdout til un-buffered først.
Så prøv at køre

    ./grove ./grovetest >buffered.txt

og sammenlign med

    ./grove ./grovetest --nobuf >unbuffered.txt


Mvh,
Henrik



References