presmerovani std a err do tehoz souboru: synchronizace, buffering?
Jan Kasprzak
kas na informatics.muni.cz
Úterý Srpen 19 00:35:55 CEST 1997
Bohumil Chalupa pise:
:
: nohup ./program -param1 -param2 >> soubor.log 2>&1 &
[...std. error a std. output se vypisuji jinak na terminal nez do souboru...]
: Poradi, prosim, nekdo, co s tim? Nebo mi vysvetlete, proc
: to tak je, jestli to jinak nejde. :-))
:
Elementary, Mr. Watson :-) Muze za to stdio a jeho zpusob bufferovani.
Jak asi vite, vystup ze stdio funkci (printf, fprintf, fputs, putchar, fputc
atd) je bufferovany. Velikost bufferu lze nastavit (setbuf, setvbuf).
Dale lze nastavit zpusob bufferovani -- zadne nebo po blocich nebo po
radcich. No a stdout i stderr se chovaji tak, ze pred prvni operaci
si knihovna pomoci fstat() zjisti, jde-li vystup na terminal (to jest
na znakove specialni zarizeni), pak se bufferuje po radcich, a v opacnem
pripade (vystup do bezneho souboru, do roury nebo do socketu) jde vystup
po celych bufferech. Proto se hlasky do souboru vypisuji zdanlive prehazene,
ve skutecnosti vsak po blocich pevne delky).
Reseni jsou dve: Budto je ./program vas program -- pak vam nic
nebrani napsat na zacatek main() prislusne volani setvbuf() na stdout
i stderr, anebo muzete ./program spustit napriklad pres prikaz
script(1). Program ./program pak bezi v pseudoterminalu a vypisuje
spokojene po radcich.
Vratim se k dalsi otazce ze zacatku dopisu:
: nohup ./program -param1 -param2 >> soubor.log 2>&1 &
:
: (mimochodem, je tento zapis ekvivalentni zapisu
: nohup ./program -param1 -param2 >> soubor.log 2>>soubor.log &
: nebo neni? Chova se to podle meho stejne.)
Viz napriklad Bach: Principy OS UNIX nebo Stevens: Advanced
Programming in UNIX Environment.
V beznem pripade (program neprovadi nejake divoke fcntl a/nebo lseek
na stdout, pripadne stderr) se to chova stejne. Z hlediska systemu
v prvnim pripade sdili deskriptory 1 a 2 strukturu file, ktera ukazuje
na strukturu inode (deskriptor 2 vznikl pres dup(1)). Ve druhem pripade
deskriptory 1 a 2 sdileji pouze odkaz na strukturu inode, ale kazdy ma svoji
strukturu file (1 i 2 vznikly volanim open()). Takze vysledky volani
lseek a vetsiny operaci fcntl se v prvnim pripade projevi na obou
deskriptorech, zatimco ve druhem pripade pouze na tom, na ktery je
lseek nebo fcntl zavolano.
-Yenya
--
\ Jan "Yenya" Kasprzak <kas at fi.muni.cz> http://www.fi.muni.cz/~kas/
\\ PGP: finger kas at aisa.fi.muni.cz 0D99A7FB206605D7 8B35FCDE05B18A5E //
\\\ Czech Linux Homepage: http://www.fi.muni.cz/~kas/linux/ ///
/// die_if_kernel("Penguin instruction from Penguin mode??!?!", regs); \\\
// -- from linux/arch/sparc64/kernel/traps.c \\
Další informace o konferenci Linux