Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sta je ispravan izlaz ovog programa

[es] :: C/C++ programiranje :: Sta je ispravan izlaz ovog programa

[ Pregleda: 2349 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Sta je ispravan izlaz ovog programa19.02.2008. u 22:52 - pre 196 meseci
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");
    }
}

 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-66-198.noos.fr.



Profil

icon Re: Sta je ispravan izlaz ovog programa20.02.2008. u 13:06 - pre 196 meseci
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)
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
77.46.190.*

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: Sta je ispravan izlaz ovog programa20.02.2008. u 22:47 - pre 196 meseci
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); )!?
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-66-198.noos.fr.



Profil

icon Re: Sta je ispravan izlaz ovog programa21.02.2008. u 13:39 - pre 196 meseci
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.

"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Sta je ispravan izlaz ovog programa22.02.2008. u 13:16 - pre 196 meseci
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.
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
77.46.190.*

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: Sta je ispravan izlaz ovog programa22.02.2008. u 13:37 - pre 196 meseci
@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 :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Sta je ispravan izlaz ovog programa

[ Pregleda: 2349 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.