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.