07-SEMNALE

27
7/23/2019 07-SEMNALE http://slidepdf.com/reader/full/07-semnale 1/27 Semnale Un semnal este o întrerupere software transmisă unui proces. Semnalele sunt o modalitate de exprimare a evenimentelor care apar sincron sau asincron în sistem. Un proces oarecare poate atât să genereze, cât și să primească semnale. În cazul în care un proces primește un semnal, el poate alege să reacționeze la semnalul respectiv  întrunul din următoarele trei moduri! să-l capteze („prindă”), executând o acțiune oarecare, prin intermediul unei funcții de tratare a semnalului "signal #andler$ să-l ignore sau să-l blocheze să execute acțiunea implicită la primirea unui semnal, care poate %, după caz, terminarea procesului sau ignorarea semnalului respectiv. &iecare proces are un set de funcții'rutine de tratare a semnalelor și pentru %ecare semnal există o acțiune speci%că. (ernelul utilizează semnale pentru semnalarea situațiilor excepționale apărute la execuția unui program. )venimentele care generează semnale pot % grupate în * mari categorii + erori, evenimente externe"'-$ și cereri explicite"ill$. /u toate erorile apărute generează semnale "ex. desc#iderea unui %șier inexistent generează o eroare dar nu produce nici un semnal$. Semnalele pot % de asemenea folosite de alte procese pentru a întrerupe anumite procese. Semnalele sunt sincrone'asincrone cu 0uxul de execuție al procesului care primește semnalul dacă evenimentul care cauzează trimiterea semnalului este sincron'asincron cu 0uxul de execuție al procesului. Un eveniment este sincron cu 0uxul de execuție al procesului dacă apare de %ecare dată la rularea programului, în același punct al 0uxului de execuție. )xemple în acest sens sunt încercarea de accesare a unei locații de memorie invalide sau nepermisă, împărțire prin zero, etc. Un eveniment este asincron dacă nu este sincron. )xemple de evenimente asincrone ! un semnal trimis de un alt proces semnalul de terminare unui proces copil, sau o cerere de terminare externă utilizatorul dorește să reseteze calculatorul. Un semnal primit de un proces poate % generat %e direct de sistemul de operare "în cazul în care acestea raportează diferite erori$, %e de un proces "careși poate trimite și singur semnale$1 evident semnalul trimis de un proces va trece tot prin sistemul de operare. 2aca un proces dorește să ignore un semnal, sistemul de operare nu va mai trimite acel semnal procesului. 2acă un proces speci%că faptul că dorește să 3loc#eze un semnal, sistemul de operare nu va mai trimite semnalele de acel tip spre procesul în cauză, și va salva numai primul semnal de acel tip, restul pierzându se. 4ând procesul #otărăște că vrea să primească din nou semnale, dacă era vreun semnal în așteptare va % trimis. 2acă două semnale sunt prea apropiate în timp ele se pot confunda întrunul singur. 5stfel, în mod normal, nu există niciun mecanism care să garanteze celui care trimite semnalul că acesta a a6uns la destinație. În anumite cazuri, există nevoia de a ști în mod sigur că un semnal trimis a a6uns la destinație și implicit că procesul va răspunde la el "efectuând una din acțiunile posi3ile$. 7entru aceste situații, sistemul de operare oferă un alt mod de a trimite un semnal prin care se garantează %e că semnalul a a6uns la destinație, %e că această acțiune a eșuat. 5cest lucru este realizat prin crearea unei stive de semnale, de o anumită capacitate "ea tre3uie să %e %nită pentru a nu produce situații de over0ow$. 8a trimiterea unui semnal, când cererea a6unge la sistemul de operare acesta veri%că dacă stiva este plină. În acest caz cererea eșuează, altfel semnalul va % pus în coadă și operația se termină cu succes. 9odul anterior de a trimite semnale este analog cu acesta "stiva are dimensiunea unu$ cu excepția faptului că nu se oferă informații despre a6ungerea la destinație a unui semnal.

Transcript of 07-SEMNALE

Page 1: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 1/27

Semnale

Un semnal este o întrerupere software transmisă unui proces. Semnalele sunt omodalitate de exprimare a evenimentelor care apar sincron sau asincron în sistem. Unproces oarecare poate atât să genereze, cât și să primească semnale. În cazul în careun proces primește un semnal, el poate alege să reacționeze la semnalul respectiv întrunul din următoarele trei moduri!

• să-l capteze („prindă”), executând o acțiune oarecare, prin intermediul uneifuncții de tratare a semnalului "signal #andler$

• să-l ignore sau să-l blocheze

• să execute acțiunea implicită la primirea unui semnal, care poate %, după caz,terminarea procesului sau ignorarea semnalului respectiv.&iecare proces are un set de funcții'rutine de tratare a semnalelor și pentru

%ecare semnal există o acțiune speci%că.(ernelul utilizează semnale pentru semnalarea situațiilor excepționale apărute la

execuția unui program. )venimentele care generează semnale pot % grupate în * maricategorii + erori, evenimente externe"'-$ și cereri explicite"ill$. /u toate erorile

apărute generează semnale "ex. desc#iderea unui %șier inexistent generează o eroaredar nu produce nici un semnal$.

Semnalele pot % de asemenea folosite de alte procese pentru a întrerupeanumite procese. Semnalele sunt sincrone'asincrone cu 0uxul de execuție alprocesului care primește semnalul dacă evenimentul care cauzează trimitereasemnalului este sincron'asincron cu 0uxul de execuție al procesului.

Un eveniment este sincron cu 0uxul de execuție al procesului dacă apare de%ecare dată la rularea programului, în același punct al 0uxului de execuție. )xemple înacest sens sunt încercarea de accesare a unei locații de memorie invalide saunepermisă, împărțire prin zero, etc. Un eveniment este asincron dacă nu este sincron.

)xemple de evenimente asincrone ! un semnal trimis de un alt proces semnalul determinare unui proces copil, sau o cerere de terminare externă utilizatorul dorește săreseteze calculatorul.

Un semnal primit de un proces poate % generat %e direct de sistemul de operare"în cazul în care acestea raportează diferite erori$, %e de un proces "careși poatetrimite și singur semnale$1 evident semnalul trimis de un proces va trece tot prinsistemul de operare. 2aca un proces dorește să ignore un semnal, sistemul de operarenu va mai trimite acel semnal procesului. 2acă un proces speci%că faptul că doreștesă 3loc#eze un semnal, sistemul de operare nu va mai trimite semnalele de acel tipspre procesul în cauză, și va salva numai primul semnal de acel tip, restul pierzânduse. 4ând procesul #otărăște că vrea să primească din nou semnale, dacă era vreun

semnal în așteptare va % trimis. 2acă două semnale sunt prea apropiate în timp ele sepot confunda întrunul singur. 5stfel, în mod normal, nu există niciun mecanism caresă garanteze celui care trimite semnalul că acesta a a6uns la destinație.

În anumite cazuri, există nevoia de a ști în mod sigur că un semnal trimis a a6unsla destinație și implicit că procesul va răspunde la el "efectuând una din acțiunileposi3ile$. 7entru aceste situații, sistemul de operare oferă un alt mod de a trimite unsemnal prin care se garantează %e că semnalul a a6uns la destinație, %e că aceastăacțiune a eșuat. 5cest lucru este realizat prin crearea unei stive de semnale, de oanumită capacitate "ea tre3uie să %e %nită pentru a nu produce situații de over0ow$.8a trimiterea unui semnal, când cererea a6unge la sistemul de operare acesta veri%cădacă stiva este plină. În acest caz cererea eșuează, altfel semnalul va % pus în coadăși operația se termină cu succes. 9odul anterior de a trimite semnale este analog cuacesta "stiva are dimensiunea unu$ cu excepția faptului că nu se oferă informațiidespre a6ungerea la destinație a unui semnal.

Page 2: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 2/27

Conceptele generării semnalelorÎn general, evenimentele care generează semnale se încadrează în trei categorii

ma6ore! erori, evenimente externe și cereri explicite.

- eroare indică faptul că un program a făcut ceva greșit și nuși poate continuaexecuția. Însă nu toate tipurile de erori generează semnale de fapt, cele mai multenu o fac. 2e exemplu, desc#iderea unui %șier inexistent este o eroare, dar nu

generează un semnal1 în sc#im3, apelul de sistem open returnează :, indicând căapelul sa terminat cu insucces" open returnează ; în caz de succes, ca ma6oritateafuncțiilor în Unix$. În general, erorile care sunt asociate cu anumite 3i3lioteci suntraportate returnând o valoare care indică o eroare. )rorile care generează semnalesunt cele care pot apărea oriunde în program, nu doar în apelurile din 3i3lioteci. )leinclud împărțirea cu zero și adresele de memorie invalide.

Un eveniment extern este în general legat de '- și alte procese. )le includapariția de noi date de intrare, expirarea unui timer, și terminarea execuției unuiproces copil.

- cerere explicită indică utilizarea unei funcții de 3i3iliotecă cum ar % ill pentrua genera un semnal.

Semnalele pot % generate sincron sau asincron. Un semnal sincron se raporteazăla o acțiune speci%că din program, și este trimis"dacă nu este 3locat$ în timpul aceleiacțiuni. 4ele mai multe erori generează semnale în mod sincron, la fel ca anumitecereri explicite făcute de către un proces de a genera un semnal pentru acelașiproces. 7e anumite mașini, anumite tipuri de erori #ardware " de o3icei excepțiile învirgulă mo3ilă$ nu sunt raportate complet sincron, și pot a6unge câteva instrucțiunimai târziu.

Semnalele asincrone sunt generate de evenimente necontrola3ile de cătreprocesul care le primește. 5ceste semnale a6ung la momente de timp impredicti3ile întimpul execuției. )venimentele externe generează semnale în mod asincron, la fel ca

și cererile explicite pentru alte procese.Un tip de semnal dat este %e sincron, %e asincron. 2e exemplu, semnalelepentru erori sunt în general sincrone deoarece erorile generează semnale în modsincron. Însă orice tip de semnal poate % generat sincron sau asincron cu o cerereexplicită.

Transmiterea și primirea semnalelor4ând un semnal este generat, el intră întro stare de așteptare "pending$. În mod

normal el rămâne în această stare pentru o perioadă de timp foarte mică și apoi estetrimis procesului care era destinația semnalului. Însă, dacă acel tip de semnal este înmomentul de față 3locat, el ar putea rămâne în starea de așteptare în mod inde%nit până când semnalele de acel timp sunt de3locate. -dată de3locat acel tip desemnale, el va % trimis imediat.

4ând semnalul a fost primit, %e imediat sau după o întârziere mare, acțiuneaspeci%cată pentru acel semnal este executată. 7entru anumite semnale. cum ar %S<(88 și S<S=-7, acțiunea este %xată "procesul este terminat$, dar pentruma6oritatea semnalelor programul poate alege să ignore semnalul, să speci%ce ofuncție de tip #andler, sau să accepte acțiunea implicită pentru tipul acela de semnal.7rogramul își speci%că alegerea utilizând funcții precum signal  sau sigaction. În timpce #andlerul rulează, acel tip de semnale este în mod normal 3locat "de3locarea se vaface printro cerere explicită în #andlerul care tratează semnalul$.

2acă acțiunea speci%cată pentru un tip de semnal este să îl ignore, atunci oricesemnal de acest tip care este generat pentru procesul în cauză este ignorat. 5celașilucru se întâmplă dacă semnalul este 3locat în acel moment. Un semnal negli6at înacest mod nu va % primit niciodata, nici dacă programul speci%că ulterior o acțiunediferită pentru acel tip de semnal și apoi îl de3loc#ează.

Page 3: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 3/27

2acă este primit un semnal pentru care nu sa speci%cat niciun tip de acțiune,se execută acțiunea implicită. &iecare tip de semnal are propria lui acțiune implicită.7entru ma6oritatea semnalelor acțiunea implicită este terminarea procesului. 7entruanumite tipuri de procese care reprezintă evenimente fără consecințe mari, acțiuneaimplicită este să nu se facă nimic.

4ând un semnal forțează terminarea unui proces, părintele său poate determinacauza terminării sale examinând codul de terminare raportat de funcțiile wait   șiwaitpid. nformațiile pe care le poate o3ține includ faptul că terminarea procesului sa

datorat unui semnal, precum și tipul semnalului. 2acă un program pe care îl rulați dinlinia de comandă este terminat de un semnal, s#ellul printează de o3icei niște mesa6ede eroare.

Semnalele care în mod normal reprezintă erori de program au o proprietatespecială! când unul din aceste semnale termină procesul, el scrie și un %șier coredump care înregistrează starea procesului în momentul terminării. 7uteți examina%șierul cu un de3ugger pentru a a0a ce anume a cauzat eroarea.

2acă generați un semnal care e in mod normal de tip eroare de program princerere explicită, și acesta termină procesul, %șierul este generat ca și cum semnalul ar% fost generat de o eroare.

mportant! În cazul în care un semnal este trimis procesului în timp ce acestaexecuta un apel de sistem 3locant, procesul va suspenda apelul, va executa #andlerulde tratare și apoi %e operația va eșua "cu errno setat pe )/=>$, %e se va restartaoperația.

Tipuri de semnaleSemnalele se împart pe categorii, care corespund în general unor acțiuni

speci%ce. &iecare semnal are asociat un număr, iar acestor numere le corespund uneleconstante sim3olice de%nite în 3i3liotecile sistemului de operare (headerul<signal.h>). 8ista semnalelor poate % o3ținută și prin comanda kill –l.

&iecare nume de semnal este o macrode%niție care reprezintă de fapt un număr întreg pozitiv + numărul pentru acel tip de semnal. Un program nu ar tre3ui să facăniciodată presupuneri despre codul numeric al unui tip particular de semnal, ci maidegra3ă, să le refere întotdeauna prin nume. 5cest lucru se datorează faptului ca unnumăr pentru un tip de semnal poate varia de la sistem la sistem, dar numele suntstandard. 7entru lista completa de semnale suportate de un sistem se poate rula înlinia de comanda

? ill l  :$ S<@U7 A$ S</= *$ S<BU= C$ S<88  D$ S<=>57 E$ S<5F>= G$ S<FUS H$ S<&7)

  I$ S<(88 :;$ S<US>: ::$ S<S)<J :A$ S<US>A  :*$ S<77) :C$ S<58>9 :D$ S<=)>9 :G$ S<4@82  :H$ S<4-/= :I$ S<S=-7 A;$ S<=S=7 A:$ S<==/  AA$ S<==-U A*$ S<U>< AC$ S<K47U AD$ S<K&SL  AE$ S<J=58>9 AG$ S<7>-& AH$ S<M/4@ AI$ S<-  *;$ S<7M> *:$ S<SNS **$ S<>=9/ *C$ S<>=9/O:  *D$ S<>=9/OA *E$ S<>=9/O* *G$ S<>=9/OC *H$ S<>=9/OD  *I$ S<>=9/OE C;$ S<>=9/OG C:$ S<>=9/OH CA$ S<>=9/OI  C*$ S<>=9/O:; CC$ S<>=9/O:: CD$ S<>=9/O:A CE$ S<>=9/O:*  CG$ S<>=9/O:C CH$ S<>=9/O:D CI$ S<>=95K:D D;$ S<>=95K:C  D:$ S<>=95K:* DA$ S<>=95K:A D*$ S<>=95K:: DC$ S<>=95K:;  DD$ S<>=95KI DE$ S<>=95KH DG$ S<>=95KG DH$ S<>=95KE

  DI$ S<>=95KD E;$ S<>=95KC E:$ S<>=95K* EA$ S<>=95KA  E*$ S<>=95K: EC$ S<>=95K

Page 4: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 4/27

/umele de semnale sunt de%nite în #eaderul signal.h. În general semnalele auroluri prede%nite, dar acestea pot % suprascrise de programator. Semnalul S</= estetransmis la apăsarea com3inației 4=>8O4, semnalul S<BU= în momentul apăsăriicom3inației de taste 4=>8OP, S<S)<J în momentul accesării unei locații invalide dememorie etc. Semnalul S<(88 nu poate % ignorat sau suprascris. =ransmitereaacestui semnal are ca efect terminarea procesului indiferent de context.

După fork() copilul nu moștenește semnalele aate în așteptare(pending) sau

timerele.

Semnale uzualeSemnale de terminare

S<=)>9 un mod QpoliticosR de a cere programului săsi termine execuția S</= program interrupt1 acest semnal este trimis procesului atunci cândutilizatorul folosește 4=>84 S<BU= similar cu S</= doar că este folosită com3inația de taste 4=>8P S<(88 procesul este imediat terminat1 acest semnal /U poate % tratat întrun modspecial de către proces

S<@U7 semnal generat de către sistemul de operare atunci când procesul estedeconectat de la terminal "de exemplu atunci când lansăm un proces pentru execuție în 3acground și apoi facem logout1 acțiunea implicită pentru S<@U7 este determinare a procesului1 dacă vrem ca procesul săsupraviețuiască tre3uie să 3locăm acest semnal, folosind utilitarul no#up$.

Semnale cauate de erori ale programelor S<&7) 0oating point exceptions, împărțire la zero, depășire. S<88 illegal instruction1 se încearcă execuția unei noninstructiuni sau a uneiinstrucțiuni privilegiate. S<S)<J segmentation violation1 programul încearcă să citească sau să scrie înafara regiunii de memorie alocate sau să scrie întro regiune de memorie readonl.

"generează cele3rul mesa6 Segmentation fault$ S<FUS încercare de a accesa o adresă invalidă. S<5F>= procesul a detectat o eroare internă și a apelat funcția a3ort"$ =oate aceste semnale au ca acțiune implicită terminarea procesului și generarea unui%șier core dump. 5cest %șier poate % folosit de către un de3ugger mai târziu pentruanalizarea cauzelor care au dus la terminarea anormală a procesului.

Semnale de alarma S<58>9 expirarea unui timer care măsoară timp real1 timerul poate % armat defuncția alarm"$ SJ=58>9 virtual time alarm1 expirarea unui timer care măsoară timpul de procesoral procesului

Semnale pentru controlul !o"#urilor S<4@82 se trimite atunci când unul din copiii procesului se termină sau este oprit1acțiunea implicită este de a ignora semnalul. S<4-/= se trimite atunci când procesul a fost pornit, după ce a fost oprit cuS<S=-71 acest semnal nu poate % 3locat1 indiferent de rezultatul execuției sale,procesul va % pornit. S<S=-7 + oprește un proces1 semnalul nu poate % 3locat, ignorat sau tratat S<=S=7 similar cu S<S=-7, dar poate % tratat sau ignorat1 se generează atuncicând se tastează 4=>8L.

Semnale programa"ile

S<US>: și S<US>A pentru clase de evenimente de%nite de utilizator1 acțiuneaimplicită este de terminare a procesului $tunci c%nd un proces este oprit& numai S''** și S'+,- pot / trimise

 procesului. 5lte semnale sunt marcate ca pending "în așteptare$ și vor % trimise cândprocesul își continuă execuția.

Page 5: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 5/27

7rocesele pot ignora, 3loca sau 0prinde0 toate semnalele cu excepția S<S=-7 șiS<(88. 2acă un proces TprindeT un semnal înseamnă că include cod care va acționacorespunzător la primirea semnalului. 2aca semnalul nu este TprinsT de proces,ernelul va executa acțiunea implicită "default$.

7entru a trimite un semnal în mod expres unui proces se folosește comanda kill.5ceasta primește ca argument 72ul procesului și tipul de semnal pe care săl trimită"implicit trimite S<=)>9":D$$.

S<=)>9":D$ se numește și softill iar S<(88"I$ se numește #ardill. Unproces poate ignora semnalul :D dar nu și semnalul I. 8a primirea semnalului :D"daca nu este ignorat$ sau I procesul tre3uie să intre în starea terminated.

rimiterea semnalului S''** (1) lui init nu are niciun efect.4omanda pkill primeste ca argument numele comenzii care rulează în procesul

căruia ii va trimite semnalul.4omanda killall se foloseste pentru a trimite semnale tuturor proceselor care

rulează su3 acelasi nume.2iferența între pkill și killall este ca pkill primește ca argument doar o parte din

numele procesului, iar killall primește ca argument întreg numele. 7entru a speci%ca

semnalul trimis se poate folosi codul numeric al semnalului sau numele acestuia. Job Control

 o3 control se refera la posi3ilitatea de a opri'suspenda execuția unui proces șirepornirea sa la un moment ulterior.

7entru a rula o comandă în 3acground se folosește TVT la sfârșitul comenzii.

23empluupdatedb &

&iecare 6o3 care rulează în 3acground primește un id "începând cu :$.

4omanda !o"s a%șează toate aceste iduri su3 forma [1] 25647. 7rimul număr reprezintă 4o" 'D iar cel deal doilea 5rocess 'D.2acă sunt mai multe 6o3uri în 3acground, semnul TOT identi%că 6o3ul care va

% utilizat ca implicit în cazul comenzilor "g  și fg, iar semnul TT identi%că 6o3ul caredevine default dacă 6o3ul curent termină execuția.

23emplufg 6!o"7id # aduce în foreground un !o" din "ackground."g 6!o"7id 8 pornește în "ackground un !o" suspendat cu +trl9: 8a înc#iderea terminalului acesta primește semnalul S<@U7. =oate procesele

pornite din terminal primesc la rândul lor semnalul S<@U7.4omanda nohup este folosită când se dorește ca un proces să nu reacționeze la

primirea semnalului S<@U7 "#angup$. 8a înc#iderea terminalului, părintele "3as#$intră în starea terminated și procesul este preluat de init .

23emplunohup comanda ;

 $plicaieSe pornește un proces dintrun terminal în mod normal "fără nohup$ în

foreground. Se dorește înc#iderea terminalului astfel încât procesul să își continueexecuția.

=wget #c #ttp!''download.fedorapro6ect.org'...'i*HE'iso'&edoraHi*HE2J2.iso=+trl9: =!o"s="g 6!o"id=disown #h 6!o"id

Page 6: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 6/27

Page 7: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 7/27

Functii și apeluri de sistem pentru lucrul cu semnale

kill()#include <sys/types.h>

#include <signal.h>

int kill(pid_t pid, int sig);

5ceastă funcție este folosită pentru a trimite un semnal unui anumit proces sau

grup de procese. În funcție de valoarea parametrului  pid, execuția apelului va aveamai multe efecte1 pentru mai multe detalii accesați manpageul kill().W pid X ; + semnalul sig va % trimis procesului pentru care 72 Y pid.W pid Y ; + semnalul sig va % trimis tuturor proceselor cu același <2 ca și procesul cea făcut apelul.W pid Y : + semnalul sig va % trimis tuturor proceselor din sistem cu excepțiaprocesului init și a procesului ce a făcut apelul.W pid Z : + trimite semnalul sig tuturor proceselor pentru care <2Ypid.

5olitica de tratare a semnalelor presupune restricionarea dreptului de a trimitesemnale către orice proces din sistem. $stfel& pentru a e?ita terminarea unor procesecare aparin altor utiliatori& funciile de lucru cu semnale permit transmiterea de

semnale între procese înrudite 8 părinte și copii. Singura e3cepie de la regulă este încaul în care se ruleaă un proces cu S2@'D setat(programul su).

raise()#include <signal.h>

int raise(int sig);

5ceastă funcție este folosită pentru a trimite un semnal către procesul curent.)xecuția ei este similară cu execuția următorului apel!kill(getpid(), sig)

abort()#include <stdlib.h>

void abort(void);

5ceastă funcție are ca efect trimiterea către procesul curent a unui semnalS<5F>=, care are ca efect terminarea anormală a procesului, mai puțin dacă semnaluleste tratat de o rutină care nu se termină. 2acă execuția lui a"ort()  are ca efectterminarea procesului, toate %șierele desc#ise în interiorul acestuia vor % înc#ise. )steimportant de notat că, dacă semnalul S<5F>= este ignorat sau 3locat, execuțiafuncției nu va ține cont de acest lucru și procesul va % terminat în mod anormal.

alarm()#include <unistd.h>

unsigned int alarm(int seconds);

)xecuția acestei funcții are ca rezultat trimiterea, după scurgerea unui număr desecunde dat de seconds, a unui semnal S<58>9 către procesul curent. 2acă o alarmăa fost de6a programată, ea este anulată în momentul execuției ultimului apel, iar dacăvaloarea lui seconds  este zero, nu va % programată o alarmă nouă. În urma execuției,se returnează numărul de secunde rămase din alarma precedentă, sau ; daca nu eraprogramată nici o alarmă.

Tratarea semnalelor

signal() modalitatea prin care se realizează captarea semnalelor în scopul tratării

lor.#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

Page 8: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 8/27

)xecuția funcției va face ca, pentru semnalul cu numărul signum speci%cat ca șiparametru, să se instaleze o noua rutină de tratare speci%cată prin parametrulhandler   . 5cest parametru tre3uie să ai3ă tipul sighandler7t , care înseamnă de faptadresa unei funcții care nu returnează nicio valoare și are un singur parametru formalde tip intreg. 5cest parametru va primi ca valoare, în momentul execuției rutinei detratare a semnalului, numărul semnalului care se tratează.

5cest lucru este util, de exemplu, atunci când se dorește tratarea mai multortipuri de semnale folosind aceeași rutină. )xistă două valori speciale pentru

parametrul handler , și anume!

:. S<[</, care instruiește procesul să ignore semnalul speci%cat -2A2+,B$-D$ A. S<[2&8, care "re$setează tratarea semnalului la comportamentul implicit.

5pelul signal() returnează rutina anterioară de tratare a semnalului, sau S<[)>> în caz de eroare. S<[)>> se returnează de exemplu atunci când signum este S<(88sau S<S=-7, care sunt semnale ce nu pot % nici captate, nici ignorate. 2e menționatfaptul că pe durata rutinei de tratare, semnalul care a fost recepționat este 3locat șiva % eventual tratat la ieșirea din această rutină.

Exemple :

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

int i=0;

void handler(int sig)

{

i++;

printf("CTRL-C\n");

if(i==3)signal(SIGINT, SIG_DFL);

}

int main()

{

signal(SIGINT,handler);

while(1){

printf("Hello World!\n");

  sleep(1);

}

return 0;

}

void handler(int signum){

// în acest moment semnalele de acelasi tip

sunt blocate

// totusi celelate tipuri de semnale sunt

active

printf("Se trateaza semnalul %d\n", signum);

// rearmez handler cu SIG_DFL

  signal(SIGINT, SIG_DFL);}

  int main(int argc, char **argv)

{

  signal(SIGINT,handler);

  raise(SIGINT);

}

 =rimiteți dintrun alt process "terminal$, pe rând, semnalele S</=, S<=)>9 șiS<(88. -3servați și explicați efectele.

Următorul su3paragraf va prezenta o metodă de captare a semnalelor care oferamai multă 0exi3ilitate decât cea descrisă anterior, prin folosirea apelului sigaction() șia apelurilor asociate cu acesta.

sigaction()int sigaction(int signum, struct sigaction *act, sigaction *oldact);

5pelul sigaction() este similar cu signal(). )l are menirea de a de%ni comportarea

procesului la primirea unui semnal. 5cest apel primește ca parametri numărulsemnalului "signum$ și două structuri de tipstruct sigaction * act // i oldactș

Page 9: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 9/27

)xecuția sa va avea ca efect instalarea noii acțiuni pentru semnalul speci%catdin act  "dacă acest parametru este nenul$, și salvarea acțiunii curente în oldact  "la fel,dacă parametrul este nenul$. Structura de tip struct sigaction este de%nită astfel!

struct sigaction {

  void (*sa_handler)(int);

  void (*sa_sigaction)(int sig, siginfo_t *, void * context);

  sigset_t sa_mask;

  int sa_flags;

  void (*sa_restorer)(void);  }

7arametrul sa7handler  reprezintă noua rutină de tratare a semnalului speci%cat,similar cu parametrul #andler prezentat la signal(). 5lternativ, dacă în sa7ags estesetat indicatorul S5[S</&- "prezentat mai 6os$, se poate de%ni o rutină careprimește trei parametri în loc de unul singur, și în acest caz ea se speci%că prinparametrul sa7sigaction.

7entru mai multe detalii legate de folosirea acestei din urmă modalități,consultați manpageul sigaction().

7arametrul sa7sigaction  reprezintă #andlerul ce tre3uie setat în structură încazul în care sa speci%cat 0agul S5[S</&-. @andlerul primește trei parametri.

7rimul parametru este numărul semnalului, al doilea este un pointer la o structură detip siginfo7t  ce conține informații adiționale despre semnal.Ultimul parametru este un pointer la o structură ce indică contextul de dinaintea

primirii semnalului "rar utilizat$. 2e%niția structurii siginfo7t  este urmatoarea !

siginfo_t {

  int si_signo; /* Signal number */

  int si_errno; /* An errno value */

  int si_code; /* Signal code */

  pid_t si_pid; /* Sending process ID */

  uid_t si_uid; /* Real user ID of sending process */

  int si_status; /* Exit value or signal */

  clock_t si_utime; /* User time consumed */

  clock_t si_stime; /* System time consumed */

  sigval_t si_value; /* Signal value */

  int si_int; /* POSIX.1b signal */

  void * si_ptr; /* POSIX.1b signal */

  void * si_addr; /* Memory location which caused fault */

  int si_band; /* Band event */

  int si_fd; /* File descriptor */

}

7arametrul sa7mask  va speci%ca setul de semnale care vor % 3locate în timpulexecuției rutinei de tratare a semnalului dat. 5cest parametru este de tipul sigset7t ,care este de fapt o mască de 3iți, cu câte un 3it pentru %ecare semnal de%nit însistem. -perațiile asupra acestui tip de mască se realizează folosind funcțiile din

familia sigsetops(C).7arametrul sa7ags va speci%ca un set de indicatori care afectează comportarea

operației de tratare a semnalelor. 5cest parametru se formează prin efectuarea uneioperații S5U logic folosind una sau mai multe din următoarele valori!

S5[/-482S=-7 daca signum  este S<4@82, procesul nu va primi un semnalS<4@82 atunci când procesul %u este suspendat "de exemplu cu S<S=-7$, ci numaicând acesta își termină execuția1

S5[-/)S@-= sau S5[>)S)=@5/2 va avea ca efect resetarea rutinei detratare a semnalului la S<[2&8 după prima rulare a rutinei, asemănător cuimplementarea originală a apelului signal()1

S5[/-95S( sau S5[/-2)&)> semnalul în discuție nu va % inclus în sa7mask "comportamentul implicit este acela de a împiedica apariția unui semnal în timpulexecuției rutinei de tratare a semnalului respectiv$1

S5[S</&- se speci%că atunci când se dorește utilizarea lui sa7siginfo  în locde sa7handler 

Page 10: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 10/27

Exemplu :

// handler pt SIGUSR2

void handler1(int signum,siginfo_t * info,void * param){

  ...

}

 

int main(void)

{

  struct sigaction semnale;

  sigset_t masca,mask,oldmask;

  sigemptyset(&masca);

  sigaddset(&masca,SIGUSR2);

  semnale.sa_flags=SA_SIGINFO;

  semnale.sa_mask=masca;

  semnale.sa_sigaction=handler1;

  sigaction(SIGUSR1,&semnale,(struct sigaction*)0);

}

locarea semnalelor7entru a putea efectua operații de 3locare'de3locare semnale avem nevoie să

știm la %ecare pas în 0uxul de execuție starea %ecărui semnal la acel moment.Sistemul de operare are de asemenea nevoie de același lucru pentru a putea face odecizie asupra unui semnal care tre3uie trimis unui proces "el are nevoie de acest gende informație pentru %ecare proces în parte$. În acest scop se foloseste o mască desemnale proprie %ecărui proces.

- mască de semnale are %ecare 3it asociat unui tip de semnal. 9asca de 3ițieste folosită de mai multe funcții, printre care și funcția sigprocmask   folosită pentrusc#im3area măștii de semnale a procesului curent.

 =ipul de date folosit de sistemele U/K pentru a reprezenta măștile de semnaleeste sigset7t . Jaria3ilele de acest tip sunt neinițializate. -perațiile pe acest tip de datesunt de inițializare cu 3iți de ; "toate semnalele ne3locate$ sau 3iți de : "toate

semnalele 3locate$, de 3locare a unui semnal, de3locare și detectare a 3locării unuisemnal!

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signo);

int sigdelset(sigset_t *set, int signo);

int sigismember(sigset_t *set, int signo);

Secvența de mai 6os este un caz de utilizare a funcțiilor de lucru cu masca desemnale în care, la %ecare D secunde, se 3loc#ează'de3loc#ează semnalul S</=!

...sigset_t set;

sigemptyset(&set);

sigaddset(&set, SIGINT);

while (1)

{

sleep(5);

sigprocmask(SIG_BLOCK, &set, NULL);

sleep(5);

sigprocmask(SIG_UNBLOCK, &set, NULL);

}

...

sigprocmask()int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

Page 11: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 11/27

5pelul sigprocmask() este folosit pentru a modi%ca lista semnalelor care sunt3locate la un moment dat. 5cest lucru se face în funcție de valoarea parametruluihow, astfel!

:. S<[F8-4( adauga la lista semnalelor 3locate semnalele din lista set  dată caparametru1

A. S<[U/F8-4( șterge din lista semnalelor 3locate semnalele a0ate în listaset 1

*. S<[S)=95S( face ca doar semnalele din lista set   să se regasească în lista

semnalelor 3locate.2aca parametrul oldest   este nenul, în el se va memora valoarea listei

semnalelor 3locate anterioară execuției lui sigprocmask().

sigpending()int sigpending(sigset_t *set);

5pelul sigpending() permite examinarea semnalelor care au apărut în timpul încare ele au fost 3locate, prin returnarea acestor semnale în masca set   dată caparametru.

void sig_usr(int signo)

{

  printf("SIGUSR1\n");

  signal(SIGUSR1, SIG_DFL);

}

int main()

{

  sigset_t newmask, oldmask, pendmask;

  signal(SIGUSR1, sig_usr);

  sigemptyset(&newmask);

  sigaddset(&newmask, SIGUSR1);

  sigprocmask(SIG_BLOCK, &newmask, &oldmask);

  sleep(5); /* SIGUSR1 - pending */

  sigpending(&pendmask);

  if (sigismember(&pendmask, SIGUSR1))

  printf("\n SIGUSR1 pending\n");

  sigprocmask(SIG_SETMASK, &oldmask, NULL);

  printf("SIGUSR1 deblocat\n");

  sleep(5);

exit(0);

}

5pelurile sigaction(), sigprocmask()  și sigpending()  întorc valoarea ; în caz desucces și : în caz de eroare.

locarea semnalelor recurenteÎn 8inux, pe timpul execuției rutinei de tratare a unui semnal, toate aparițiile

ulterioare ale aceluiași semnal sunt 3locate. 5cest lucru nu înseamnă că rutina nupoate % apelată la apariția unui alt semnal "care are atri3uită aceeași rutină$.

7entru a clari%ca acest lucru, rulați exemplul de mai 6os întrun terminal și, dintrun alt terminal, trimiteți pe rând, de mai multe ori, semnalele S<US>: și S<US>A.

#include <stdio.h>#include <sys/types.h>

#include <unistd.h>

#include <sys/wait.h>

int a=1;

Page 12: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 12/27

void handler(int sig)

{

sigset_t mask;

sigemptyset(&mask);

printf("sig=%d\n",sig);

if(sig==SIGUSR1)

while(a<40)

{

sigpending(&mask);if(sigismember(&mask, SIGUSR1))

printf("\nSIGUSR1 pending\n");

sigemptyset(&mask);

a++;

printf("SIGUSR1 a=%d\n",a);

sleep(2);

}

else

while(a<40)

{

a++;

printf("SIGUSR2 a=%d\n",a);

sleep(2);

}}

int main()

{

signal(SIGUSR1,handler);

signal(SIGUSR2,handler);

  while(1){

printf("runing...\n");

  sleep(2);

}

return 0;

}

Semnalarea proceselor cu !unc"ia sig#ueue()&uncția kill() nu garantează faptul că semnalul a a6uns la destinație și nu oferă

niciun mecanism prin care să se veri%ce acest lucru. 2aca avem nevoie să trimitem unsemnal unui proces și să stim sigur că a a6uns putem utiliza funcția sigueue() !

int sigqueue(pid_t pid, int signo, const union sigval value);

W pid  72ul procesului căruia i se va trimite semnalulW signo  semnalul ce va % trimisW ?alue  o valoare ce va % trimisă odată cu semnalul

&uncția trimite semnalul signo  cu valoarea speci%cată de ?alue  procesului cuidenti%catorul  pid. Jaloarea ce poate % trimisă odată cu semnalul este o uniune deforma!

union sigval {

  int sival_int;

  void *sival_ptr;

};

Un parametru trimis astfel apare în campul si7?alue al structurii siginfo7t  primitede #andlerul de semnal. 2acă semnalul speci%cat este 3locat în acel moment, funcțiava ieși imediat1 dacă 0agul S5[S</&- este setat și există resurse necesare, semnalul

va % pus în coadă în starea pending "un proces poate avea în coada de pending maximS<BU)U)[95K semnale$.5tunci când semnalul este primit, câmpul si7code  pasat structurii siginfo va %

setat la S[BU)U). 2acă nu există resurse necesare pentru a trimite semnalul "i.e.,dacă toate cele S<BU)U)[95K locuri în coadă sunt ocupate$ funcția esuează. 2acă

Page 13: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 13/27

0agul S5[S</&- nu este setat, atunci signo, dar nu în mod necesar și ?alue vor %trimise cel puțin o dată procesului care tre3uie să primească semnalul.

$șteptarea unui semnalÎn cazul în care se utilizează semnalele pentru comunicare și'sau sincronizare

există adeseori nevoie să se aștepte ca un anumit tip de semnal să parvină procesului în cauză. Un simplu mod de a realiza acest lucru este o 3uclă a cărei condiție de ieșirear % setarea corespunzătoare a unei varia3ile "varia3ila tre3uie sa %e de tipulsig7atomic7t $.

while (!signal_has_arrived);

7rincipalul dezavanta6 al a3ordării de mai sus "de tip 3uswaiting$ este timpulde procesor pe care procesul considerat îl pierde în mod inutil. - alternativă ar %folosirea funcției sleep!

while (!signal_has_arrived) {

sleep(1);

}

- astfel de a3ordare nu ar mai ocupa timp de procesor inutil, dar timpul derăspuns în cazul sosirii unui semnal este destul de mare. - altă soluție a pro3lemeieste funcția pause() care 3loc#ează 0uxul de execuție până când procesul curent este întrerupt de un semnal. 2eși această a3ordare pare foarte simplă, ea introduceadeseori deadlocuri care 3loc#ează programul nede%nit.

while (!signal_has_arrived) {

pause();

}

Fucla este necesară pentru prevenirea situației în care procesul este întrerupt

de alte semnale decât cel așteptat.Se poate întâmpla ca semnalul să a6ungă după testarea varia3ilei și înainte deapelul funcției pause. În acest caz procesul se 3loc#ează și, dacă nu apare un altsemnal care să cauzeze ieșirea din pause, el va ramâne 3locat nede%nit.

sigsuspend()Soluția cea mai 3ună pentru a atepta un semnal se poate realiza prin utilizarea

funcției

int sigsuspend(const sigset_t *set);

&uncția înlocuiește temporar masca de semnale 3locate a procesului cu set   șiapoi suspendă procesul până când este primit un semnal care nu este 3locat de nouamască. 8a ieșire, funcția restaurează vec#ea mască de semnale.

În secvența de mai 6os, funcția sigsuspend()  este folosită pentru a întrerupeprocesul curent pâna la recepționarea semnalului S<US>:. Semnalele S<(88 șiS<S=-7, deși prezente în masca de semnale, nu vor % 3locate!...

sigset_t set;

/* block all signals except SIGINT */

sigfillset(&set);

sigdelset(&set, SIGINT);

/* wait for SIGINT */sigsuspend(&set);

...

Timere și sleep

Page 14: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 14/27

În 8inux, folosirea timerelor este legată de folosirea semnalelor. 5cest lucru se întâmplă întrucât cea mai mare parte a funcțiilor de tip timer folosesc semnale.

Un timer este, de o3icei, un întreg a cărui valoare este decrementată peparcursul trecerii timpului. În momentul în care întregul a6unge la ;, timerul expiră. În8inux, rezultatul expirării timerului, este, în general, transmiterea unui semnal.2e%nirea unui Ttimer #andlerT "rutină apelată în momentul expirării timerului$ este,astfel, ec#ivalentă cu de%nirea unui #andler pentru semnalul asociat.

Înregistrarea unui timer în 8inux înseamnă speci%carea unui interval după care

un timer expiră și con%gurarea #andlerului care va rula. &iind vor3a de semnale,con%gurarea #andlerului se realizează prin intermediul funcției sigaction().Speci%carea unui interval de timeout se realiză folosind funcția alarm() sau setitimer().

5pelul alarm() este mai simplu, dar oferă granularitate la nivel de secundă. 8aexpirarea timeoutului, se transmite semnalul S<58>9. 5pelul setitimer()  este maicomplex, dar oferă granularitate la nivel de microsecundă. În funcție de primulargument se vor livra semnalele S<58>9, S<J=58>9 respectiv S<7>-&. "citiți manpageurile celor A funcții$

9ai 6os este prezentată o secvență de cod de folosire a funcțiilor alarm()  șisetitimer()

#include <unistd.h> /* for alarm(2) */

#include <sys/time.h> /* for setitimer(2) */

#define TIMEOUT 5

/* setup SIGALRM handler */

...

alarm(TIMEOUT); /* SIGALRM is delivered every TIMEOUT seconds */

....

struct itimerval timer;

memset(&timer, 0, sizeof(timer));

timer.it_value.tv_sec = TIMEOUT; /* first delivery after TIMEOUT seconds */

timer.it_interval.tv_sec = TIMEOUT; /* periodic delivery after TIMEOUT seconds */

if (setitimer(ITIMER_REAL, &timer, NULL) < 0) {

/* handle error */

...}

Una din formele de utilizare a timerelor este implementarea funcțiilor deașteptare de tipul sleep() sau nanosleep().

5vanta6ul folosirii funcției sleep() este simplitatea. 2ezavanta6ele sunt rezoluțiascăzută "secunde$ și posi3ila interacțiune cu semnale "în special S<58>9$.nanosleep()  are un apel mai complex, dar oferă rezoluție pâna la ordinulnanosecundelor și este TsignalsafeT nu interacționează cu semnale.

int nanosleep(const struct timespec *req, struct timespec *rem);

nanosleep() primește ca argumente A referințe către A structuri de tipultimespec. 7rima structură este folosită pentru a pasa la primul apel durata "în secundesau nanosecunde$ inițială de QsleepR "re.t?7sec  sau re.t?7nsec$. În cazul în careapelul este interrupt de un eveniment, în cea dea doua structură va % reținută duratade timp rămasă din apelul initial "rem.t?7sec sau rem.t?7nsec$.

  struct timespec {

  time_t tv_sec; /* seconds */

  long tv_nsec; /* nanoseconds */

  };

Un exemplu pentru a evidenția modalitatea de a asigura o perioadă completă de

QsleepR, c#iar și în cazul apariției unei întreruperi.

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

Page 15: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 15/27

#include <sys/wait.h>

int a=1;

struct timespec time1,time2;

void handler(int sig)

{

printf("SIGUSR1 time=%d\n",(int)time2.tv_sec);

nanosleep(&time2,NULL); //din time2.tv_sec se va restaura durata de timp r?mas?

}

int main()

{

signal(SIGUSR1,handler);

time1.tv_sec=20;

while(1)

{

a++;

printf("runing... a=%d\n",a);

nanosleep(&time1,&time2);

}

return 0;

}

Tratarea semnalelor2e o3icei, #andlerele "funcțiile'rutinele de tratare a semnalelor$ nu presupun

foarte multe acțiuni'instrucțiuni. )ste o practică 3ună să se construiască #andlere caredoar să modi%ce doar o varia3ilă, lăsând alte instrucțiuni dorite a se executa laapariția unui semnal c#iar în sarcina programului. 5sta deoarece un semnal poate %recepționat asincron, la momente de timp total nepredicti3ile ceea ce poate ducec#iar la structuri de date inconsistente.

Func"ii reentrante

2e asemenea, este recomandat ca eventualele apeluri de funcții din interiorul#andlerelor să %e pentru !unc"ii reentrante "pot % întrerupte în timpul execuției șiapoi reapelate fără pro3leme + semnale, zone de memorie alocate'utilizate etc$.

- funcție poate % nonreentrantă dacă folosește date care nu sunt pe stivă utilizarea unei varia3ile'referințe statică sau glo3ală poate duce la apeluri ale aceleiașifuncții care să interfereze "ex. operații de '- cu streamuri + #andler care scrie întrun%șier$.

5ceastă pro3lemă poate % întâlnită atunci când se dorește alocarea'eli3erareadinamică de memorie "malloc,free + nonreentrante$. 2e asemenea, orice funcție caremodi%că errno este nonreentrantă.%ariabile atomice

5ccesul individual la date nu este neapărat atomic"pot % necesare mai multeinstrucțiuni pentru a modi%ca astfel de date$. 5stfel, un #andler poate rula între Aetape ale unei citiri'scrieri de date.

7entru aceasta se poate scrie codul în așa fel încât nimic să nu poată interfera înmomente c#eie ale execuției, se pot 3loca semnale sau se pot utiliza date cu accesatomic"date atomice$.

4itirea'scrierea unei varia3ile sig_atomic_t  este garantată a se executa întrosingură instrucțiune, un #andler neputânduse executa în mi6locul unei astfel deoperațiuni.

- varia3ilă sig7atomic7t  este în general de tipul întreg însă dimensiunea poate

varia de la o platformă la alta. În practică, se poate considera că o varia3ilă int  sau unpointer sunt tipuri de date atomice.- altă a3ordare este aceea a prote6ării oricărui tip de date sau oricărei secțiuni

de cod prin limitarea accesului prin intermediul unor o3iecte asupra cărora se potefectua numai acțiuni atomice + mutexuri și semafoare.

Page 16: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 16/27

 Semnale &eal'time

7-SK permite utilizarea semnalelor realtime de către programator și nu au oacțiune speci%că prede%nită "S<>=9/ și S<>=95K $.

Spre deose3ire de celelate semnale disponi3ile în sistem, un semnal >= poateavea mai multe instanțe puse în coada de așteptare a unui proces. 9ai mult decâtatât, ordinea livrării semnalelor este garantată.

Fork Un proces copil își începe execuția fără a avea vreun semnal în coada de

așteptare c#iar dacă părintele avea puse în coada proprie anumite semnale lamomentul apelului fork().

@andlerele de semnale și semnalele 3locate sunt moștenite de către procesulcopil. 5tri3utele descriptorilor de %șiere relative la semnale sunt, de asemenea,moștenite.

Treads5vând în vedere că, în cazul unui program multit#readed, toate t#readurile

rulează su3 același 72, se pune pro3lema identi%cării t#readului care tre3uie sătrateze orice semnal primit de procesul de care aparține.În cazul /ative 7-SK =#reads 8i3rar "/7=8$, versiune disponi3iliă din A;;C,

există A situații distincte!a$ Semnale adresate proceselor   "trimise cu apelul kill()  către un 72

cunoscut$ =#readurile unui proces au propria mască de semnale ce poate % modi%cată

folosind apelul  pthread7sigmask(), asemănător cu sigprocmask(). 5stfel, dacă unsemnal transmis unui proces, acesta va % livrat, în mod aleatoriu, unuia dintret#readurile din cadrul procesului care nu au 3locat acest semnal. 2acă toatet#readurile au semnalul 3locat, atunci acesta este pus în coada de așteptare a

procesului.3$ Semnale adresate threadurilor  "trimise cu apelul pthread7kill()$Se pot astfel transmite'recepționa semnale, separat, pentru %ecare t#read în

parte. 5stfel, un t#read poate trimite altui t#read un semnal, dar poate să și activezeun semnal pentru el însuși. )xistă și semnale de sistem generate pentru un t#readanume "S<S)<J$. 5cest lucru presupune existența unei cozi de așteptare pentrusemnale pentru %ecare t#read în parte.

2acă nu există de%nit un #andler pentru un semnal adresat unui t#read, iaracțiunea implicită este terminarea execuției întregului proces, procesul de careaparține t#readul își va înc#eia execuția.

5pelul raise() presupune trimiterea unui semnal către t#readul apelant.În concluzie, handlerele'rutinele de tratare sunt atribute valabile la nivelul 

unui proces. 5stfel, întrun program multit#readed, #andlerele sunt aceleași pentrutoate t#readurile procesului.

Page 17: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 17/27

)K)978)

:. 7ro3lema producător + consumator cu semnale#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#define TRUE 1

#define FALSE 0

int produce=FALSE;

int consuma=FALSE;

void intSIGALRM()

{

  produce=TRUE;

}

void intSIGTERM()

{

  consuma=TRUE;

}

int main()

{

  unsigned char articol;  int life=10;

  int pid1, pid2;

  int fildes[2];

  signal(SIGALRM, intSIGALRM);

  signal(SIGTERM, intSIGTERM);

  pipe(fildes);

  if((pid1=fork())==0){

  // proces producator

  close(fildes[0]);

  while(life--){

  while (produce==FALSE);

  articol=(unsigned char)rand();

 

write(fildes[1],&articol,sizeof(articol));

  printf("\nP%d:%02X >> ", life, articol);

  fflush(stdout);

  produce=FALSE;

  signal(SIGALRM, intSIGALRM);

  signal(SIGTERM, SIG_IGN);

  kill(0, SIGTERM);

  }

  exit(0);

  }

if((pid2=fork())==0){

  // proces consumator

  close(fildes[1]);

  while(life--){

  while (consuma==FALSE);

read(fildes[0],&articol,sizeof(articol));

  printf("C%d:%02X", life, articol);

  fflush(stdout);

  consuma=FALSE;  signal(SIGTERM, intSIGTERM);

  signal(SIGALRM, SIG_IGN);

  kill(0, SIGALRM);

  }

  exit(0);

  }

  // proces coordonator

  kill(pid1,SIGALRM);

  return 0;

}

A. 74 "nter 7rocess 4ommunication$ cu semnale + S<US>:, S<US>A

/* When a SIGUSR1  signal arrives, set this

variable.*/

volatile sig_atomic_t usr_interrupt = 0;

void synch_signal (int sig)

{

  usr_interrupt = 1;

}

/*The child process executes this function.*/

void child_function (void)

{

  /* Perform initialization. */

  printf ("I'm here!!! My pid is %d.\n",

(int) getpid ());

  /* Let parent know you're done. */

  kill (getppid (), SIGUSR1);

  /* Continue with execution. */

  puts ("Bye, now....");

  exit (0);

}

int

main (void)

{

  struct sigaction usr_action;

  sigset_t block_mask;

  pid_t child_id;

  /* Establish the signal handler. */

  sigfillset (&block_mask);

  usr_action.sa_handler = synch_signal;

  usr_action.sa_mask = block_mask;

  usr_action.sa_flags = 0;

  sigaction (SIGUSR1, &usr_action, NULL);

  /* Create the child process. */

  child_id = fork ();

  if (child_id == 0)

  child_function (); /* Does not

return. */

  /* Busy wait for the child to send a

signal. */

  while (!usr_interrupt)

  ;

Page 18: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 18/27

  /* Now continue execution. */

  puts ("That's all, folks!");

  return 0;

}

*. lustrează folosirea semnalului S<58>9char user[40]; // buffer pt a citi numele utilizatorului din vectorul de caractere user

void catch_alarm(int sig_num) //definirea handler-ului semnal de alarma

{

printf("Operation timed out. Exiting...\n\n");

exit(0);}

int main(int argc, char* argv[])

{

signal(SIGALRM, catch_alarm); // seteaza un handler de semnale pt.semnale ALRM

printf("Numele utilizatorului este: "); // avertizeaza introducerea numelui utilizatorului

fflush(stdout);

alarm(30); // porneste o alarma de 30 de secunde

gets(user); //asteptare introducere utilizator

alarm(0); // înlaturarea timer-ului

printf("Numele utilizatorului este: '%s'\n", user);

return 0;

}

C.#include <signal.h>

#include <ourhdr.h>

static void sig_usr(int); //un handler pt.cele 2 semnale SIGUSR1 si SIGUSR2

int main(void)

{

if (signal(SIGUSR1, sig_usr) == SIG_ERR)

err_sys("can't catch SIGUSR1");

if (signal(SIGUSR2, sig_usr) == SIG_ERR)

err_sys("can't catch SIGUSR2");

for ( ; ; )

pause();

}

static void sig_usr(int signo) // argumentul este nr.semnalului signo adica

{

if (signo == SIGUSR1) //daca argumentul semnalului signo este //SIGUSR1

printf("received SIGUSR1\n"); //atunci s-a primit semnalul //SIGUSR1

else if (signo == SIGUSR2) // daca argumentul semnalului signo este //SIGUSR2

printf("received SIGUSR2\n"); //atunci s-a primit semnalul //SIGUSR2

else

err_dump("received signal %d\n", signo);

return;

\D.

/* Global variables that control process

shutdown. */

sig_atomic_t graceful_quit = 0;

sig_atomic_t abortive_quit = 0;

/* Signal handler for SIGINT. */

void SIGINT_handler (int signum)

{

assert (signum == SIGINT);

graceful_quit = 1;

}

/* Signal handler for SIGQUIT. */

void SIGQUIT_handler (int signum)

{

assert (signum == SIGQUIT);

abortive_quit = 1;

}

/* ... */

int main (void)

{

struct sigaction sa;

sigemptyset (&sa.sa_mask);

sa.sa_flags = 0;

/* Register the handler for SIGINT. */

sa.sa_handler = SIGINT_handler;sigaction (SIGINT, &sa, 0);

/* Register the handler for SIGQUIT. */

sa.sa_handler = SIGQUIT_handler;

sigaction (SIGQUIT, &sa, 0);

Page 19: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 19/27

/* Run the main event loop. */

while (graceful_quit == 0

&& abortive_quit == 0)

do_work ();

if (abortive_quit == 1) {

 _exit (1);

}

else if graceful_quit {

clean_up ();

exit (0);

}

/* NOTREACHED */

}

E. Să se scrie un program care ilustrează modurile de tratare ale unui semnal."S<58>9,S<US>:,S</=,S<BU=$

#include <signal.h> // directiva ce contine numele tuturor semnalelor precum si prototipul kill()

#include <hdr.h>

static void sig_usr1( int); /* generat cu kill USR1 <pid */

static void sig_intr( int); /* generat la Ctrl-C si rearmat */

static void sig_quit( int); /* generat cu Ctrl-\ si resetat */

static void sig_alarm(int); /* generat dupa scurgerea timpului t din alarm(t) */

int main( void)

{

if ( signal( SIGALRM, sig_alarm) == SIG_ERR)

err_sys("Eroare signal( SIGALRM, ...)");

if ( signal( SIGUSR1, sig_usr1) == SIG_ERR)err_sys("Eroare signal( SIGUSR1, ...)");

if ( signal( SIGINT, sig_intr) == SIG_ERR)

err_sys("Eroare signal( SIGINT, ...)");

if ( signal( SIGQUIT, sig_quit) == SIG_ERR)

err_sys("Eroare signal( SIGQUIT, ...)");

for ever pause();

}

static void sig_alarm( int sig)

{

printf("Receptionat semnalul SIGALRM\n");

return;

}

static void sig_quit( int sig)

{

printf("Receptionat semnalul SIGQUIT\n");

if ( signal( SIGQUIT, SIG_DFL) == SIG_ERR)

err_sys("Nu se poate reseta acest semnal ...");

return;

}

static void sig_intr( int sig)

{

printf("Receptionat semnalul SIGINT\n");

if ( signal( SIGINT, sig_intr) == SIG_ERR)

err_sys("Nu se poate rearma acest semnal ...");

return;

}

static void sig_usr1( int sig)

{

printf("Receptionat semnalul SIGUSR1\n");

alarm(1);

printf("Alarma se va declansa dupa 1 sec!.\n");

return;

}

G. .

Page 20: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 20/27

$*+,Standard Signals

 =#is section lists t#e names for various standard inds of signals and descri3es w#atind of event t#e mean. )ac# signal name is a macro w#ic# stands for a positiveintegert#e signal num"er  for t#at ind of signal. Nour programs s#ould never mae

assumptions a3out t#e numeric code for a particular ind of signal, 3ut rat#er refer tot#em alwas 3 t#e names de%ned #ere. =#is is 3ecause t#e num3er for a given indof signal can var from sstem to sstem, 3ut t#e meanings of t#e names arestandardized and fairl uniform.

 =#e signal names are de%ned in t#e #eader %le ]signal.#^.

9acro! int S-.

 =#e value of t#is sm3olic constant is t#e total num3er of signals de%ned. Since t#esignal num3ers are allocated consecutivel, /S< is also one greater t#an t#e largestde%ned signal num3er.

rogram !rror Signals

 =#e following signals are generated w#en a serious program error is detected 3 t#eoperating sstem or t#e computer itself. n general, all of t#ese signals are indicationst#at our program is seriousl 3roen in some wa, and t#ere^s usuall no wa tocontinue t#e computation w#ic# encountered t#e error.

Some programs #andle program error signals in order to tid up 3efore terminating1

for example, programs t#at turn o_ ec#oing of terminal input s#ould #andle programerror signals in order to turn ec#oing 3ac on. =#e #andler s#ould end 3 specifingt#e default action for t#e signal t#at #appened and t#en reraising it1 t#is will cause t#eprogram to terminate wit# t#at signal, as if it #ad not #ad a #andler. "See section@andlers =#at =erminate t#e 7rocess.$

 =ermination is t#e sensi3le ultimate outcome from a program error in most programs.@owever, programming sstems suc# as 8isp t#at can load compiled user programsmig#t need to eep executing even if a user program incurs an error. =#ese programs#ave #andlers w#ic# use long6mp to return control to t#e command level.

 =#e default action for all of t#ese signals is to cause t#e process to terminate. f ou3loc or ignore t#ese signals or esta3lis# #andlers for t#em t#at return normall, ourprogram will pro3a3l 3rea #orri3l w#en suc# signals #appen, unless t#e aregenerated 3 raise or ill instead of a real error.

M#en one of t#ese program error signals terminates a process, it also writes a coredump /le w#ic# records t#e state of t#e process at t#e time of termination. =#e coredump %le is named ]core^ and is written in w#ic#ever director is current in t#e processat t#e time. "-n t#e </U sstem, ou can specif t#e %le name for core dumps wit#t#e environment varia3le 4->)&8).$ =#e purpose of core dump %les is so t#at ou canexamine t#em wit# a de3ugger to investigate w#at caused t#e error.

9acro! int S-.F/*

Page 21: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 21/27

 =#e S<&7) signal reports a fatal arit#metic error. 5lt#oug# t#e name is derived fromT0oatingpoint exceptionT, t#is signal actuall covers all arit#metic errors, includingdivision 3 zero and over0ow. f a program stores integer data in a location w#ic# ist#en used in a 0oatingpoint operation, t#is often causes an Tinvalid operationTexception, 3ecause t#e processor cannot recognize t#e data as a 0oatingpointnum3er.

5ctual 0oatingpoint exceptions are a complicated su36ect 3ecause t#ere are man

tpes of exceptions wit# su3tl di_erent meanings, and t#e S<&7) signal doesn^tdistinguis# 3etween t#em. =#e '222 Standard for EinarF Gloating#5oint $rithmetic($-S'H'222 Std IJK#L1MJ) de%nes various 0oatingpoint exceptions and re`uiresconforming computer sstems to report t#eir occurrences. @owever, t#is standarddoes not specif #ow t#e exceptions are reported, or w#at inds of #andling andcontrol t#e operating sstem can o_er to t#e programmer.

FS2 sstems provide t#e S<&7) #andler wit# an extra argument t#at distinguis#esvarious causes of t#e exception. n order to access t#is argument, ou must de%ne t#e#andler to accept two arguments, w#ic# means ou must cast it to a oneargument

function tpe in order to esta3lis# t#e #andler. =#e </U li3rar does provide t#is extraargument, 3ut t#e value is meaningful onl on operating sstems t#at provide t#einformation "FS2 sstems and </U sstems$.

&7)[/=-J&[=>57 

nteger over0ow "impossi3le in a 4 program unless ou ena3le over0ow trappingin a #ardwarespeci%c fas#ion$.

&7)[/=2J[=>57 

nteger division 3 zero.

&7)[SUF>/<[=>57 

Su3scriptrange "somet#ing t#at 4 programs never c#ec for$.

&7)[&8=-J&[=>57 

&loating over0ow trap.

&7)[&8=2J[=>57 

&loating'decimal division 3 zero.

&7)[&8=U/2[=>57 

&loating under0ow trap. "=rapping on 0oating under0ow is not normallena3led.$

&7)[2)4-J&[=>57 

2ecimal over0ow trap. "-nl a few mac#ines #ave decimal arit#metic and 4never uses it.$

9acro! int S-.-00

 =#e name of t#is signal is derived from Tillegal instructionT1 it means our program istring to execute gar3age or a privileged instruction. Since t#e 4 compiler generates

Page 22: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 22/27

onl valid instructions, S<88 tpicall indicates t#at t#e executa3le %le is corrupted, ort#at ou are tring to execute data. Some common was of getting into t#e lattersituation are 3 passing an invalid o36ect w#ere a pointer to a function was expected,or 3 writing past t#e end of an automatic arra "or similar pro3lems wit# pointers toautomatic varia3les$ and corrupting ot#er data on t#e stac suc# as t#e return addressof a stac frame.

9acro! int S-.S*.%

 =#is signal is generated w#en a program tries to read or write outside t#e memort#at is allocated for it. "5ctuall, t#e signals onl occur w#en t#e program goes farenoug# outside to 3e detected 3 t#e sstem^s memor protection mec#anism.$ =#ename is an a33reviation for Tsegmentation violationT.

 =#e most common wa of getting a S<S)<J condition is 3 dereferencing a null oruninitialized pointer. 5 null pointer refers to t#e address ;, and most operatingsstems mae sure t#is address is alwas invalid precisel so t#at dereferencing a nullpointer will cause S<S)<J. "Some operating sstems place valid memor at address ;,

and dereferencing a null pointer does not cause a signal on t#ese sstems.$ 5s foruninitialized pointer varia3les, t#e contain random addresses w#ic# ma or ma not3e valid.

5not#er common wa of getting into a S<S)<J situation is w#en ou use a pointer tostep t#roug# an arra, 3ut fail to c#ec for t#e end of t#e arra.

9acro! int S-.1S

 =#is signal is generated w#en an invalid pointer is dereferenced. 8ie S<S)<J, t#issignal is tpicall t#e result of dereferencing an uninitialized pointer. =#e di_erence

3etween t#e two is t#at S<S)<J indicates an invalid access to valid memor, w#ileS<FUS indicates an access to an invalid address. n particular, S<FUS signals oftenresult from dereferencing a misaligned pointer, suc# as referring to a fourword integerat an address not divisi3le 3 four. ")ac# ind of computer #as its own re`uirementsfor address alignment.$

 =#e name of t#is signal is an a33reviation for T3us errorT.

9acro! int S-.$&T

 =#is signal indicates an error detected 3 t#e program itself and reported 3 callinga3ort. See section 53orting a 7rogram.

Termination Signals

 =#ese signals are all used to tell a process to terminate, in one wa or anot#er. =#e#ave di_erent names 3ecause t#e^re used for slig#tl di_erent purposes, andprograms mig#t want to #andle t#em di_erentl.

 =#e reason for #andling t#ese signals is usuall so our program can tid up asappropriate 3efore actuall terminating. &or example, ou mig#t want to save state

information, delete temporar %les, or restore t#e previous terminal modes. Suc# a#andler s#ould end 3 specifing t#e default action for t#e signal t#at #appened andt#en reraising it1 t#is will cause t#e program to terminate wit# t#at signal, as if it #adnot #ad a #andler. "See section @andlers =#at =erminate t#e 7rocess.$

Page 23: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 23/27

 =#e "o3vious$ default action for all of t#ese signals is to cause t#e process toterminate.

9acro! int S-.21/

 =#e S<@U7 "T#angupT$ signal is used to report t#at t#e user^s terminal isdisconnected, per#aps 3ecause a networ or telep#one connection was 3roen. &ormore information a3out t#is, see section 4ontrol 9odes.

 =#is signal is also used to report t#e termination of t#e controlling process on aterminal to 6o3s associated wit# t#at session1 t#is termination e_ectivel disconnectsall processes in t#e session from t#e controlling terminal. &or more information, seesection =ermination nternals.

9acro! int S-.-T

 =#e S</= "Tprogram interruptT$ signal is sent w#en t#e user tpes t#e /=> c#aracter"normall 4c$. See section Special 4#aracters, for information a3out terminal driver

support for4c

.9acro! int S-.31-T

 =#e S<BU= signal is similar to S</=, except t#at it^s controlled 3 a di_erent et#eBU= c#aracter, usuall 4Pand produces a core dump w#en it terminates t#eprocess, 6ust lie a program error signal. Nou can t#in of t#is as a program errorcondition TdetectedT 3 t#e user.

See section 7rogram )rror Signals, for information a3out core dumps. See sectionSpecial 4#aracters, for information a3out terminal driver support.

4ertain inds of cleanups are 3est omitted in #andling S<BU=. &or example, if t#eprogram creates temporar %les, it s#ould #andle t#e ot#er termination re`uests 3deleting t#e temporar %les. Fut it is 3etter for S<BU= not to delete t#em, so t#at t#euser can examine t#em in con6unction wit# t#e core dump.

9acro! int S-.T*&4

 =#e S<=)>9 signal is a generic signal used to cause program termination. UnlieS<(88, t#is signal can 3e 3loced, #andled, and ignored.

 =#e s#ell command ill generates S<=)>9 3 default.

9acro! int S-.5-00

 =#e S<(88 signal is used to cause immediate program termination. t cannot 3e#andled or ignored, and is t#erefore alwas fatal. t is also not possi3le to 3loc t#issignal.

 =#is signal is generated onl 3 explicit re`uest. Since it cannot 3e #andled, ous#ould generate it onl as a last resort, after %rst tring a less drastic met#od suc# as

4c or S<=)>9. f a process does not respond to an ot#er termination signals, sendingit a S<(88 signal will almost alwas cause it to go awa.

n fact, if S<(88 fails to terminate a process, t#at 3 itself constitutes an operatingsstem 3ug w#ic# ou s#ould report.

Page 24: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 24/27

 "larm Signals

 =#ese signals are used to indicate t#e expiration of timers. See section Setting an5larm, for information a3out functions t#at cause t#ese signals to 3e sent.

 =#e default 3e#avior for t#ese signals is to cause program termination. =#is default israrel useful, 3ut no ot#er default would 3e useful1 most of t#e was of using t#esesignals would re`uire #andler functions in an case.

9acro! int S-.$0&4

 =#is signal tpicall indicates expiration of a timer t#at measures real or cloc time. tis used 3 t#e alarm function, for example.

9acro! int S-.%T$0&4

 =#is signal tpicall indicates expiration of a timer t#at measures 47U time used 3t#e current process. =#e name is an a33reviation for Tvirtual time alarmT.

9acro! int S-./&6F

 =#is signal is tpicall indicates expiration of a timer t#at measures 3ot# 47U timeused 3 t#e current process, and 47U time expended on 3e#alf of t#e process 3 t#esstem. Suc# a timer is used to implement code pro%ling facilities, #ence t#e name oft#is signal.

 "s#nchronous $%& Signals

 =#e signals listed in t#is section are used in con6unction wit# asnc#ronous '-

facilities. Nou #ave to tae explicit action 3 calling fcntl to ena3le a particular %ledescriptior to generate t#ese signals "see section nterrupt2riven nput$. =#e defaultaction for t#ese signals is to ignore t#em.

9acro! int S-.-6

 =#is signal is sent w#en a %le descriptor is read to perform input or output.

-n most operating sstems, terminals and socets are t#e onl inds of %les t#at cangenerate S<-1 ot#er inds, including ordinar %les, never generate S<- even if ouas t#em to.

9acro! int S-.1&.

 =#is signal is sent w#en TurgentT or outof3and data arrives on a socet. See section-utofFand 2ata.

 'ob ontrol Signals

 =#ese signals are used to support 6o3 control. f our sstem doesn^t support 6o3control, t#en t#ese macros are de%ned 3ut t#e signals t#emselves can^t 3e raised or

#andled. Nou s#ould generall leave t#ese signals alone unless ou reall understand #ow 6o3control wors. See section o3 4ontrol.

Page 25: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 25/27

9acro! int S-.C207

 =#is signal is sent to a parent process w#enever one of its c#ild processes terminatesor stops.

 =#e default action for t#is signal is to ignore it. f ou esta3lis# a #andler for t#is signalw#ile t#ere are c#ild processes t#at #ave terminated 3ut not reported t#eir status viawait or waitpid "see section 7rocess 4ompletion$, w#et#er our new #andler applies to

t#ose processes or not depends on t#e particular operating sstem.

9acro! int S-.C6T

 Nou can send a S<4-/= signal to a process to mae it continue. =#e default 3e#aviorfor t#is signal is to mae t#e process continue if it is stopped, and to ignore itot#erwise.

9ost programs #ave no reason to #andle S<4-/=1 t#e simpl resume executionwit#out realizing t#e were ever stopped. Nou can use a #andler for S<4-/= to mae a

program do somet#ing special w#en it is stopped and continuedfor example, toreprint a prompt w#en it is suspended w#ile waiting for input.

9acro! int S-.ST6/

 =#e S<S=-7 signal stops t#e process. t cannot 3e #andled, ignored, or 3loced.

9acro! int S-.TST/

 =#e S<=S=7 signal is an interactive stop signal. Unlie S<S=-7, t#is signal can 3e#andled and ignored.

 Nour program s#ould #andle t#is signal if ou #ave a special need to leave %les orsstem ta3les in a secure state w#en a process is stopped. &or example, programst#at turn o_ ec#oing s#ould #andle S<=S=7 so t#e can turn ec#oing 3ac on 3eforestopping.

 =#is signal is generated w#en t#e user tpes t#e SUS7 c#aracter "normall 4z$. &ormore information a3out terminal driver support, see section Special 4#aracters.

9acro! int S-.TT-

5 process cannot read from t#e t#e user^s terminal w#ile it is running as a 3acground 6o3. M#en an process in a 3acground 6o3 tries to read from t#e terminal, all of t#eprocesses in t#e 6o3 are sent a S<==/ signal. =#e default action for t#is signal is tostop t#e process. &or more information a3out #ow t#is interacts wit# t#e terminaldriver, see section 5ccess to t#e 4ontrolling =erminal.

9acro! int S-.TT61

 =#is is similar to S<==/, 3ut is generated w#en a process in a 3acground 6o3attempts to write to t#e terminal or set its modes. 5gain, t#e default action is to stop

t#e process.M#ile a process is stopped, no more signals can 3e delivered to it until it is continued,except S<(88 signals and "o3viousl$ S<4-/= signals. =#e S<(88 signal alwas causestermination of t#e process and can^t 3e 3loced or ignored. Nou can 3loc or ignore

Page 26: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 26/27

S<4-/=, 3ut it alwas causes t#e process to 3e continued anwa if it is stopped.Sending a S<4-/= signal to a process causes an pending stop signals for t#at processto 3e discarded. 8iewise, an pending S<4-/= signals for a process are discardedw#en it receives a stop signal.

M#en a process in an orp#aned process group "see section -rp#aned 7rocess <roups$receives a S<=S=7, S<==/, or S<==-U signal and does not #andle it, t#e process doesnot stop. Stopping t#e process would 3e unreasona3le since t#ere would 3e no wa to

continue it. M#at #appens instead depends on t#e operating sstem ou are using.Some sstems ma do not#ing1 ot#ers ma deliver anot#er signal instead, suc# asS<(88 or S<@U7.

iscellaneous Signals

 =#ese signals are used to report various ot#er conditions. =#e default action for all oft#em is to cause t#e process to terminate.

9acro! int S-./-/*

f ou use pipes or &&-s, ou #ave to design our application so t#at one processopens t#e pipe for reading 3efore anot#er starts writing. f t#e reading process neverstarts, or terminates unexpectedl, writing to t#e pipe or &&- raises a S<77) signal. fS<77) is 3loced, #andled or ignored, t#e o_ending call fails wit# )77) instead.

7ipes and &&- special %les are discussed in more detail in section 7ipes and &&-s.

5not#er cause of S<77) is w#en ou tr to output to a socet t#at isn^t connected. Seesection Sending 2ata.

9acro! int S-.1S&8

9acro! int S-.1S&9

 =#e S<US>: and S<US>A signals are set aside for ou to use an wa ou want. =#e^reuseful for interprocess communication. Since t#ese signals are normall fatal, ous#ould write a signal #andler for t#em in t#e program t#at receives t#e signal.

 =#ere is an example s#owing t#e use of S<US>: and S<US>A in section Signaling5not#er 7rocess.

*onstandard Signals

7articular operating sstems support additional signals not listed a3ove. =#e 5/S 4standard reserves all identi%ers 3eginning wit# ]S<^ followed 3 an uppercase letterfor t#e names of signals. Nou s#ould consult t#e documentation or #eader %les for ourparticular operating sstem and processor tpe to %nd out a3out t#e speci%c signals itsupports.

&or example, some sstems support extra signals w#ic# correspond to #ardware traps.Some ot#er inds of signals commonl supported are used to implement limits on 47U

time or %le sstem usage, asnc#ronous c#anges to terminal con%guration, and t#elie. Sstems ma also de%ne signal names t#at are aliases for standard signal names.

 Nou can generall assume t#at t#e default action "or t#e action set up 3 t#e s#ell$ forimplementationde%ned signals is reasona3le, and not worr a3out t#em ourself. n

Page 27: 07-SEMNALE

7/23/2019 07-SEMNALE

http://slidepdf.com/reader/full/07-semnale 27/27

fact, it^s usuall a 3ad idea to ignore or 3loc signals ou don^t now ant#ing a3out,or tr to esta3lis# a #andler for signals w#ose meanings ou don^t now.

@ere are some of t#e ot#er signals found on commonl used operating sstems!

S<482 

-3solete name for S<4@82.

S<=>57 

<enerated 3 t#e mac#ine^s 3reapoint instruction. Used 3 de3uggers. 2efaultaction is to dump core.

S<-= 

<enerated 3 t#e 727:: TiotT instruction1 e`uivalent to S<5F>=. 2efault actionis to dump core.

S<)9= 

)mulator trap1 t#is results from certain unimplemented instructions. t is aprogram error signal.

S<SNS 

Fad sstem call1 t#at is to sa, t#e instruction to trap to t#e operating sstemwas executed, 3ut t#e code num3er for t#e sstem call to perform was invalid. =#is is a program error signal.

S<7-88 

 =#is is a Sstem J signal name, more or less similar to S<-.

S<K47U 

47U time limit exceeded. =#is is used for 3atc# processing. 2efault action isprogram termination.

S<K&SL 

&ile size limit exceeded. =#is is used for 3atc# processing. 2efault action is

program termination.S<M/4@ 

Mindow size c#ange. =#is is generated on certain sstems w#en t#e size of t#ecurrent window on t#e screen is c#anged. 2efault action is to ignore it.