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ď č. 1Keď 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.)