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