Petru Ratiu wrote:
2008/12/18 Dan Uscatu <dusc...@lunatech.ro>:
Simplu, bufferingul se face la output (adica scrie pe stdout cate o
linie sau cate un calup). Rasnita pe care merge are un grep care face
implicit line-buffering (vezi grep -V) .

Ca sa simulezi pe aia pe care nu merge, try:

tail -f | grep --line-buffered | grep

Echivalentul perl al lui grep --line-buffered ar fi ceva gen:

do_something | perl -lne 'BEGIN {$|=1} print if /regexp/' |
do_something_else

chestie care dupa parerea mea e mai portabila cu mai putine surprize
decat grepurile mai mult sau mai putin posixoase sau gnuiste.
Nu cred ca ne intelegem. Pe ambele risnite, tail -f file | grep string face
acelasi lucru, anume prezinta cite o linie imediat ce aceasta apare in file.
Comportamentul se schimba cind se mai adauga un | grep.

Anyway, surpriza emisiunii este ca versiunea de grep este aceeasi (2.5.1)
si, desi nu scrie in man, si cea de pe risnita cu buffer mare suporta
optiunea --line-buffer.

De unde anume se seteaza optiunile implicite pentru grep ? Si de ce anume
primul grep din sir se comporta intr-un fel (line buffer) cind scrie pe
stdout, dar altfel (buffer mare) cind scrie catre un pipe ?


Cred ca aici deja ne trebuie un kernel guru care sa ne explice
comportamentul lui pipe() (apelat de shell cand apare |) si buffer
size-ul implicit.

Din ce stiu eu parametrul ala pentru GNU grep sau $| la perl le spune
sa forteze pipe-ul sa faca flush la buffer dupa fiecare linie scrisa.
Pipe-ul sta in OS nu in grep, kernelul e cel care decide ce se
intampla cand e consumata de alt proces sau de un char device.

Nu-s mare kernel hacker si e posibil sa fi zis o tampenie, asa ca sunt
si eu curios ce zice cineva care chiar stie detalii.
E un thread care se numeste "tcpdump q" prin decembrie 2005 in care s-au contrat Liviu Daia cu Tarhon Onu Victor pe teme de buffering si kernel. Nu cred ca s-au schimbat prea multe de pe vremea aia.

Dragos


_______________________________________________
RLUG mailing list
RLUG@lists.lug.ro
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui