[so] [Curs 08] Fire de executie - masca de semnale (UNIX)

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Wed May 24 17:40:05 EEST 2017


"George-Sebastian PÎRTOACĂ (66847)" via so <so at cursuri.cs.pub.ro>
writes:
> Salut,
>
> Am vazut ca in cursul 8 pus pe ocw se precizeaza ca firele de executie
> ale unui proces partajeaza masca de semnale (pagina 15 din fisierul
> PDF). In man (man 7 pthreads) se precizeaza ca "As well as the stack,
> POSIX.1 specifies that various other attributes are distinct for each
> thread, including: ... signal mask (pthread_sigmask(3)) ...".
>
>
> Din cate am putut observa, ceea ce se intampla atunci cand un proces
> primeste un semnal asincron este ca nucleul se uita daca thread-ul
> "principal" (cel pentru care pid == tgid) blocheaza sau nu semnalul:
> daca da, atunci cauta iterativ prin lista de firele de executie si se
> opreste la primul thread care nu blocheaza semnalul, daca nu atunci ii
> livreaza semnalul. Aceste observatii sunt valabile pentru Linux.
>
> Prin urmare, fiecare fir de executie dintr-un proces are propria masca
> de semnale (privata) sau imi scapa mie ceva?

Salutare.

Masca de semnale a unui proces nu e partajată între thread-uri. Fiecare
thread are mască proprie; e o greșeală în curs. Am corectat în curs[1].

Modul de tratare al semnalelor este comun, adică există un singur
handler, dar fiecare thread are masca sa și poate bloca anumite semnale,
parcurgerea măștilor făcându-se în ordine, așa cum spui tu.

Pentru procese single-threaded folosim sigprocmask() pentru controlul
măștii, iar pentru procese multi-threaded folosim pthread_sigmask().

Vezi și precizările de aici[2] și aici[3].

[1] https://ocw.cs.pub.ro/courses/so/cursuri/curs-08
[2] https://stackoverflow.com/questions/11679568/signal-handling-with-multiple-threads-in-linux
[3] http://poincare.matf.bg.ac.rs/~ivana/courses/tos/sistemi_knjige/pomocno/apue/APUE/0201433079/ch12lev1sec8.html

Răzvan


More information about the so mailing list