Evo da probam.
Mada moram da priznam da sam varao na kartama, pošto sam neverovatnom igrom slučaja juče dobio skoro isto takvo pitanje. I upecao se kao šaran na „očigledan“ odgovor, ali sam probao da zatim razmislim o čemu je reč. U svakom slučaju evo nekakvog objašnjenja, možda sam čak i nabo pravu stvar.
Kao što svi znaju (a ko ne zna može da iskoristi
man fork pa da vidi), fork() pravi kopiju trenutnog procesa, ako sve prođe kako treba, ili vraća grešku ako bude problema.
Zbog toga nema sumnje je da petlja i poziv fork() naprave najviše
kopija trenutnog procesa za
, odnosno ostavi jednu jedinu kopiju programa za
.
Ako gledate kao što sam ja gledao isprva, pomislićete da u prvom slučaju svi procesi ispisuju po jedan
m, a da u drugom samo prvi proces ispisuje
m. Ovog pitanja naravno ne bi bilo kada bi sve bilo tako pravolininjski. Na mom računaru, oba programa ispisuju
m-ove
puta! Da stvar bude zanimljivija, ako se "m" zameni sa "m\n", stvari bivaju drugačije; prvi program ima manje-više isti izlaz, dok drugi da samo jedno slovo m .
Međutim, upis u
stdout je linijski baferisan. To što smo upisali slovo u stdout pomoću printfa ne znači da će ono automatski da se pojavi na terminalu. Jednostavno je ostalo u izlaznom baferu i čeka ili znak za novi red ili da bafer bude popunjen ili
fflush() kako bi bilo prosleđeno dalje. (možda postoje još neke mogućnosti, ja ih više ne znam; sećam se jedino da na je DOS-u to radilo malko drugačije, negde u C-FAQ-u postoji pitanjce na ovu temu, možda ga kasnije nađem).
Posmatramo program b). Dakle najpre upišemo u bafer slovo
m. Zatim pozovemo fork() odgovarajući broj puta. Ali pošto fork() kopira „sve“ podatke o procesu (ne znam šta tačno znači sve, to je verovatno negde definisano al to ne znači da moram da takve podatke držim u glavi:) posle nekoliko fork()-ova dobili smo procese koji svi „misle“ da imaju po jedno m u izlaznom baferu. (šta se tačno kopira i da li je sam bafer
deljen između procesa ili se pak naprave nezavisne kopije za svaki proces, to ne znam; međutim to ima uticaj na ono što se zatim dešava s programom ali o tom potom, već je dosta pretpostavki ispucano).
Na kraju svih procesa, svi odrade fflush() (ovo bi trebalo da je deo
runtime biblioteke, pretpostavljam) i svi ispišu po jedno m. Redosled događaja ovde zavisi verovatno i od toga da li je korisnik promenio način baferisanja, veličinu bafera i šta znam šta još, ali to je opet još jedan set pretpostavki.
f