[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