printf() - podivne chovani
Michal Krause
mike na navrcholu.cz
Sobota Říjen 2 22:26:09 CEST 1999
Zdravim,
narazil jsem na (pro me) zahadne chovani funkce printf(). Mam program,
ktery naforkuje deset potomku v cyklu, ktery vypada asi takto:
for (pind = 0; pind < 10; pind++)
{
pipe(pipes[pind]);
childs[pind] = fork();
switch (childs[pind])
{
case -1 :
fprintf(stderr, "Fork failed\n");
break;
case 0 :
child();
return 0;
break;
default :
printf("Fork no. %d (PID=%d) successful\n", pind, childs[pind]);
fflush(stdout);
close(pipes[pind][0]);
break;
}
}
Problem je v tom, ze pokud vypustim fflush(stdout) po volani printf("Fork...)
a stdout je soubor, objevi se v tomto souboru radek "Fork no. ..."
nekolikrat.
Konkretne pro pind == 0 desetkrat, pro pind == 1 devetkrat, pro pind == 2
osmkrat atd.
Nejdrive jsem si rikal, ze jsem nekde udelal nejakou chybu a program se
opakovane dostane do teto casti. Pro jistotu jsem pridal do vypisovaneho
retezce i PID, abych zjistil, jestli mi nahodou nejaky detsky proces nedela
co nema - vsechno ma na svedomi rodic. Jeho krokovani nic neodhalilo a navic
pokud byl stdout konzole, fungovalo vse dobre. Napadlo me, ze rozdil mezi
souborem a konzoli je v tom, ze konzole pouziva radkove orientovane
bufferovani, takze se diky \n na konci retezce vypisuje ihned. Zkusil jsem
tedy pridat fflush(stdout) a program se zacal chovat podle mych predstav i v
pripade presmerovani stdout do souboru.
Muze mi prosim nekdo vysvetlit, proc se tak deje? Mozna, ze je chyba na moji
strane, ale koukam do toho uz par hodin a na nic jsem neprisel. V zadnem
jinem programu se mi nepovedlo toto chovani zopakovat.
Jadro je 2.2.9, RH6.0, glibc 2.1.1-6
Pokud nekoho neco napadne, budu povdecen...
--
S pozdravem
Michal Krause /\
ICQ: 7665279 Informace (nejenom) ze sveta Linuxu /\/ \
email: mike na navrcholu.cz ______ http://www.root.cz/ ______ NAVRCHOLU.cz
Co napsat do signatury, aby to nikoho nepohorsilo? Snad jedine nejakou
obecne znamou pravdu. Doufam, ze vsichni vite, ze tucnak je bylozrava ryba.
Další informace o konferenci Linux