Portál AbcLinuxu, 5. května 2025 14:49

Dotaz: gcc v twilight zone

18.6.2014 21:56 klid
gcc v twilight zone
Přečteno: 340×
Odpovědět | Admin
Zdravím vospolok,

Vie mi niekto vysvetliť tento jav?

Mám takýto nezmyselný program, volá sa 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:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (rADOn)
18.6.2014 22:52 Sten
Rozbalit Rozbalit vše Re: gcc v twilight zone
Odpovědět | | Sbalit | Link | Blokovat | Admin
Protože výstup na konzoli se bufferuje po řádcích, zatímco do souboru po blocích.

Při zápisu na konzoli se tudíž zapíše do bufferu 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.
18.6.2014 23:07 Sten
Rozbalit Rozbalit vše Re: gcc v twilight zone
Btw. řešení je před fork() dát fflush(stdout)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.