Tworzenie procesów za pomocą forka

0

Mam pytanie, dlaczego poniższy program wypisuje mi literkę 'k' 24 razy?
Według tego jak ja rozumiem działanie forka to powinno to nastąpić 14 razy. Zgodnie z poniższym schematem:
user image

Sam kod wygląda po prostu tak:

 
#include <stdio.h>
int main()
{
    int i;
    for(i=0; i<3; i++){
           fork();
           printf(" k ");
     }

     return 0;
}
0

Powiedz mi kolego jakim cudem 14 razy, skoro zaczynasz petle od 0 do 3. Pokaz reszte kodu

0

szczerze powiem, że nie wiem czemu tak się dzieje, pewnie coś ze strumieniami, ale jak zmienisz na printf(" k\n"); to wypisuje 14 razy

1

Moje silne przypuszczenia:

stdout jest line buffered, więc printf(" k\n"); czyści bufor od razu, a printf( "k" ) nie, czeka na wyczyszczenie bufora później. AFAIK procesy stworzone przez fork współdzielą bufor, toteż wszystkie piszą do tego samego bufora, a co gorsza, każdy proces, gdy się skończy, wypisuje ten sam bufor na wyjście, duplikując to, co wypisały poprzednie procesy źle, poprawka niżej.

Kiedyś miałem podobne cyrki, jak wiele procesów wypisywało dane do tego samego pliku. To samo: dane były wypisywane wielokrotnie. Pomogło kombinowanie z funkcją setvbuf / setbuf, http://en.cppreference.com/w/c/io/setvbuf , http://en.cppreference.com/w/c/io/setbuf . Nie pamiętam już, czy wyłączyłem buforowanie w ogóle, czy dałem każdemu procesowi osobny bufor, ale pomogło.

Spróbowałem, czy jeśli proces macierzysty wyłączy buforowanie przed mnożeniem się (przed pętlą for), setbuf(stdout, NULL), to czy to pomoże. I pomogło.

Właściwie to też trzeba się dowiedzieć, czy tutaj nie ma jakiegoś Undefined Behaviour. Wielokrotne wypisywanie tych samych, już wypisanych danych z tego samego bufora trochę mi tym pachnie, ale nie wiem.

0

@kmph wielkie dzięki za obszerną odpowiedź! :D

Zauważyłem też, że wyczyszczenie bufora przez fflush(stdout) po wypisaniu k pomaga

0

Przepraszam, zdaje się że pokręciłem trochę.

Procesy chyba jednak nie współdzielą bufora, ale za to fork() kopiuje bufor jak inne zmienne.

Oznacza to, że problem powinien być rozwiązany, jeśli tylko będzie się zawsze pamiętać, by przed forkiem czyścić bufor.

Powyższe zaczerpnąłem z http://stackoverflow.com/questions/2530663/printf-anomaly-after-fork

1 użytkowników online, w tym zalogowanych: 0, gości: 1