[so] Exercitiul 3 - cursul 3 Procese

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sat Sep 5 21:48:48 EEST 2009


On Thu, 2009-09-03 at 16:45 +0300, Cosmin Ratiu wrote:

> 
> Corect e
> while (flag == 0)
>   pause();
> pt ca daca pui doar if se poate sa iti vina alt semnal decat cel
> asteptat.

Nu e perfect corect. E _mai_ corect, dar nu s-ar fi punctat.

> In plus, se poate intampla un race: daca semnalul vine intre if si
> pause, progamul o sa iti ramana blocat. Asta presupun ca se poate
> rezolva cu un sleep periodic + while de mai sus, dar nu am folosit
> ceva de genul niciodata, asa ca nu imi dau seama daca e bine sau nu.

Intr-adevar, comparatia flag == 0 si pause() se pot executa non-atomic.
Comparatia ar trebui realizata prin blocarea semnalelor. Cel mai usor se
poate realiza folosind sigprocmask si sigsuspend:

---
/* build set with SIGUSR1 */
sigemptyset(&set);
sigaddset(&set, SIGUSR1);

/* get process mask */
sigprocmask(0, NULL, &old_set);

/* block SIGUSR1 */
sigprocmask(SIG_BLOCK, &set);

/* do comparison */
...

/* atomic unblock (use old_set) and suspend */
sigsuspend(&old_set);
---

Vezi si manualul libc pentru detalii[1] (paragraful "Why Blocking
Signals is Useful")

Razvan

[1] http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html#SEC368



More information about the so mailing list