Portál AbcLinuxu, 5. května 2025 14:49
fork7.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main () {
printf("alfa\n");
fork();
fork();
fork();
}
Skompilujem ho takto
gcc fork7.c -o fork7
Keď spustím program ./fork7
, vypíše alfa
a skončí. To je očakávané a žiadúce.
Keď ho ale spustím takto:
./fork7 > out.txt
V súbore out.txt
mám riadok alfa
osemkrát! Chová sa to tak, ako keby výpis bol na konci programu, pod forkami. Je to zle, ale rozumiem tomu. Prečo to ale vypisuje potom na konzolu alfa
iba raz?
Řešení dotazu:
alfa\n
, a protože je tam konec řádku, tak se buffer flushne (zapíše na výstup). Provede se fork
a při ukončení každého dítěte se buffer znovu flushne. Ale protože tam už nic není, tak se nic nevypíše.
Při zápisu do souboru se zapíše do bufferu alfa\n
, ale to je menší než blok (standardně to bývá jedna stránka), tak se to neflushne. Provede se fork
, všechny děti tak získají kopii toho bufferu, který se při ukončení flushne. Ale teď prázdný není, každý proces má svoji vlastní kopii a tu vypíše.
Stejný efekt (vypíše se 8×) uvidíte i při zápisu na konzoli, pokud ve vypisovaném textu nebude znak ukončení řádku.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.