[so] o problema ciudata

Cosmin Arad so@atlantis.cs.pub.ro
Tue, 11 Nov 2003 02:10:55 -0800 (PST)


--- Marian Mihailescu <mmk@as.ro> wrote:
> pe "scurt":
> "If sem_op is 0 (read operation) and semval is
> non-zero, the process
> sleeps on a queue waiting for semval to become
> zero."
> Am facut un program mic care incrementeaza val unui
> semafor; daca valoarea
> semaforului ajunge la N, atunci un alt semafor e
> facut 0. In continuare se
> face un sem_op 0 pe semaforul 2, si cand iese
> afiseaza ceva. Pornesc
> programul, intra in starea "waiting"... de ce atunci
> cand il intrerup
> (CTRL-Z) si il trimit in background ("bg") se sare
> de starea waiting ?
> (a se intelege ca e vb de linux...)

Operatiile blocante pot fi intrerupte de semnale.
Probabil ca procesul tau din background incearca sa
faca o scriere sau o citire de la stdout/stdin si
primeste un semnal SIGTTOU/SIGTTIN pt ca nu are
consola (fiind in background) iar parintele sau
primeste un semnal SIGCHLD.
Daca nu asta e cazul, in orice caz procesul tau care
asteapta la semafor este deblocat de catre un semnal.

De aceea este recomandat ca operatiile blocante sa se
efectueze intr-o bucla de genul:

do {
        result = operatie_blocanta();
} while (result != OK);
/* conditia result != OK variaza de la caz la caz */

Aceast lucru este valabil atat pentru semafoare cat si
pentru cozi de mesaje.

Succes,
Cosmin

__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree