[ obucina @ 19.02.2008. 22:52 ] @
Cygwin kaze ABBC, Linux gcc kaze ABABC.
Ja mislim da je, po opisu funkcije fork, ispravan izlaz ABBC. Medjutim pod Linux-om je to ABABC, zbog necega u vezi sa stdout i meni nije jasno kako dolazi do toga da se pojavi jos jedno A. Ima li neko objasnjenje...

Code:

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

int main() {
    pid_t pid;
    
    pid = fork();
    if (pid == 0) {
        printf("A");
        fork();
        printf("B");
    }
    else if (pid > 0) {
        wait (NULL);
        printf("C");
    }
}

[ rumpl @ 20.02.2008. 13:06 ] @
Problem je printf koji baferizuje tj. ne ispise odmah sve sto mu das.

Evo sta se desava :
printf("A"); << "A" je stavljen u stdout bafer
fork(); << posle ovog imas 2 procesa koji imaju svaki svoj bafer, ali sin je nasledio bafer oca (tj. sin ima "A" u baferu).
printf("B"); << sin i otac "pisu" "B" tj. u baferu sina i oca imas "AB".

I na kraju deka :
printf("C");

i posle toga svi baferi su ispisani na ekran:
sin ispise : "AB"
otac ispise "AB"
deka ispise "C"

Zato imas "ABABC"

Ako hoces da se sve lepo ispise koristi write koji ne baferizije ili ovako : printf("A\n"); (\n tera printf da ispljune bafer)

(sve sto sam rekao se desava pod linuxom)
[ Mister_rap @ 20.02.2008. 22:47 ] @
Tacno tacno :)

Cinjenica je da ovo bilo tesko pretpostaviti-znati, tako da je Stevino resenje uslovno receno korektno...
Poslao sam mu mail ja u vezi ovoga i ranije pa cu da vidim sta ce da odgovori :)

Ps.
Kolega zar tvoj odgovor nije bio nesto drugacji od ABBC (zbog wait (NULL); )!?
[ rumpl @ 21.02.2008. 13:39 ] @
Steva ?
Kolega ?

Ne razumem, jel se ovo odnosi na ovaj problem ili ne ?

wait(NULL); ti obezbedjuje da "C" dolazi na kraju, bez wait-a bi "C" mogao biti bilo gde (CABB, ACBB, ABCB, ABBC), sve zavisi od schedulera.
[ obucina @ 22.02.2008. 13:16 ] @
Ovo je bilo jedno od 10 ispitnih pitanja, Steva je profesor, a Aleksandar i ja smo kolege.

Negde sam nasao da je ovo posledica nacina realizacije baferisanja stdio na Linuksu. Posto program daje razlicite izlaze u razlicitim kompajlerima, po meni ovo nije trebalo da se nadje na ispitu, ali sad, sta je tu je...

Moj odgovor je bio ABB, nisam znao kako se ponasa wait(NULL), mislio sam da tu ili blokira ili pravi gresku. Do ABBC sam dosao kada sam program preveo Cygwin-om, a do ABABC kada sam ga preveo Ubuntu-ovim gcc.
[ Mister_rap @ 22.02.2008. 13:37 ] @
@rupmpl
Nadam se da je sad malo jasnije!

@obucina
Ma ja sam pitao Stevu da objasni pa on nije znao, tako da sigurno nije trebalo da se nadje na ispitu :)