V Programu 1 Hello world
vytiskne se jen jednou, ale když odstraním \n
a spusťte jej (Program 2), výstup se vytiskne 8krát. Může mi někdo prosím vysvětlit význam \n
zde a jak to ovlivňuje fork()
?
Program 1
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...\n");
fork();
fork();
fork();
}
Výstup 1:
hello world...
Program 2
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...");
fork();
fork();
fork();
}
Výstup 2:
hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...
Přijatá odpověď:
Při výstupu na standardní výstup pomocí printf()
knihovny C výstup je obvykle vyrovnávací paměť. Vyrovnávací paměť se nevyprázdní, dokud nevypíšete nový řádek, zavolejte fflush(stdout)
nebo ukončete program (ne voláním _exit()
ačkoli). Standardní výstupní proud je ve výchozím nastavení tímto způsobem ukládán do vyrovnávací paměti, když je připojen k TTY.
Když rozvětvíte proces v „Programu 2“, podřízené procesy zdědí každou část nadřazeného procesu, včetně nevyprázdněné výstupní vyrovnávací paměti. To efektivně zkopíruje nevyprázdněnou vyrovnávací paměť do každého podřízeného procesu.
Po ukončení procesu se vyrovnávací paměti vyprázdní. Spustíte celkem osm procesů (včetně původního procesu) a nevyprázdněná vyrovnávací paměť bude vyprázdněna při ukončení každého jednotlivého procesu.
Je osm protože na každém fork()
získáte dvojnásobný počet procesů, které jste měli před fork()
(protože jsou bezpodmínečné) a máte tři z nich (2 =8).