/ / C Vysvetlenie výstupu programu vidlice - c, unix, buffer, vidlice

C vidlica program výstup vysvetlenie - c, unix, buffer, vidlica

Mám program v C, ktorý využíva fork() systémové volanie:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

void doit(void)
{
pid_t pid;
fork();
fork();
printf("Unix System Programmingn");
return;
}

int main(void)
{
doit();
printf("WTFn");
exit(0);
}

Teraz, tento program mi dáva 8 riadkov výstupu. Myslím, že je to kvôli dvom vidliciam 2 ^ 2 = 4 Times * 2 Print Statement = 8 Times. Ak sa mýlim, opravte ma a vysvetlite prečo.

Otázkou je, prečo dostávam na každom behu rôzne výstupy? Povedzme, že spustím tento kód: prvýkrát dostanem výstup

Unix System Programming
WTF
Unix System Programming
Unix System Programming
Unix System Programming
WTF
WTF
WTF

a druhýkrát som:

Unix System Programming
WTF
Unix System Programming
Unix System Programming
WTF
Unix System Programming
WTF
WTF

A po tretíkrát znova. Prečo sa to stalo? Som bezradný; podrobne vysvetlite.

odpovede:

3 pre odpoveď č. 1

Keď vidíte nový proces, rodič a dieťa bežia súčasne. Poradie, ktoré vykonajú printf() Výkazy sú nepredvídateľné - niekedy rodič najprv vytlačí, niekedy dieťa.

Môžete lepšie porozumieť, ak ste do výstupu zahrnuli PID, takže môžete vidieť, ktorý proces tlačí každý riadok. Zmeňte ju na:

printf("%d: Unix System Programmingn", getpid());

a

printf("%d: WTFn", getpid());

Čo by ste mali vidieť, je to, že každý proces tlačí Unix System Programming pred WTF, ale poradie procesov bude zmiešané.


2 pre odpoveď č. 2

Výstupy, ktoré vidíte, pochádzajú z rôznych procesov. akonáhle fork sa podarilo, dostanete iný proces dieťaťa(ako aj materský proces). Vzhľadom k tomu, že sú z rôznych procesov, môžete "zaručiť, keď jeden proces dostane svoje obrátky a vykonáva. Takže výstupy rôznych procesov sa zmiešajú a poradie môže byť odlišné pri každom spustení."

Ak sa chcete uistiť, že rodič a dieťaprocesy bežia v nejakom špecifickom poradí, potom ich musíte synchronizovať, čo je zvyčajne oveľa viac práce, než len rozvetvenie. (Pravdepodobne bude vyžadovať operáciu čakania alebo použitie rúrok - v závislosti od povahy synchronizácie, ktorú chcete.)