Sunteți pe pagina 1din 24

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 att s genereze, ct i s primeasc semnale. n cazul n care un proces primete un semnal, el poate alege s reacioneze la semnalul respectiv ntr unul din urmtoarele trei moduri! s-l capteze (prind), executnd o aciune oarecare, prin intermediul unei funcii de tratare a semnalului "signal #andler$ s-l ignore sau s-l blocheze s execute aciunea implicit la primirea unui semnal, care poate fi, dup caz, terminarea procesului sau ignorarea semnalului respectiv. %iecare proces are un set de funcii&rutine de tratare a semnalelor i pentru fiecare semnal exist o aciune specific. 'ernelul utilizeaz semnale pentru semnalarea situaiilor excepionale aprute la execuia unui program. (venimentele care genereaz semnale pot fi grupate n ) mari categorii * erori, evenimente externe"+&,$ i cereri explicite"-ill$. .u toate erorile aprute genereaz semnale "ex. desc#iderea unui fiier inexistent genereaz o eroare dar nu produce nici un semnal$. Semnalele pot fi de asemenea folosite de alte procese pentru a ntrerupe anumite procese. Semnalele sunt sincrone&asincrone cu fluxul de execuie al procesului care primete semnalul dac evenimentul care cauzeaz trimiterea semnalului este sincron&asincron cu fluxul de execuie al procesului. Un eveniment este sincron cu fluxul de execuie al procesului dac apare de fiecare dat la rularea programului, n acelai punct al fluxului de execuie. (xemple n acest sens sunt ncercarea de accesare a unei locaii de memorie invalide sau nepermis, mprire 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 dorete s reseteze calculatorul. Un semnal primit de un proces poate fi generat fie direct de sistemul de operare "n cazul n care acestea raporteaz diferite erori$, fie de un proces "care i poate trimite i singur semnale$/ evident semnalul trimis de un proces va trece tot prin sistemul de operare. 0aca un proces dorete s ignore un semnal, sistemul de operare nu va mai trimite acel semnal procesului. 0ac un proces specific faptul c dorete s 1loc#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 pierzndu se. 2nd procesul #otrte c vrea s primeasc din nou semnale, dac era vreun semnal n ateptare va fi trimis. 0ac dou semnale sunt prea apropiate n timp ele se pot confunda ntr unul singur. 3stfel, n mod normal, nu exist niciun mecanism care s garanteze celui care trimite semnalul c acesta a a4uns la destinaie. n anumite cazuri, exist nevoia de a ti n mod sigur c un semnal trimis a a4uns la destinaie i implicit c procesul va rspunde la el "efectund una din aciunile posi1ile$. 5entru aceste situaii, sistemul de operare ofer un alt mod de a trimite un semnal prin care se garanteaz fie c semnalul a a4uns la destinaie, fie c aceast aciune a euat. 3cest lucru este realizat prin crearea unei stive de semnale, de o anumit capacitate "ea tre1uie s fie finit pentru a nu produce situaii de overflow$. 6a trimiterea unui semnal, cnd cererea a4unge la sistemul de operare acesta verific dac stiva este plin. n acest caz cererea eueaz, altfel semnalul va fi pus n coad i operaia se termin cu succes. 7odul anterior de a trimite semnale este analog cu acesta "stiva are dimensiunea unu$ cu excepia faptului c nu se ofer informaii despre a4ungerea la destinaie a unui semnal.

Conceptele generrii semnalelor


n general, evenimentele care genereaz semnale se ncadreaz n trei categorii ma4ore! erori, evenimente externe i cereri explicite.

, eroare indic faptul c un program a fcut ceva greit i nu i poate continua execuia. ns nu toate tipurile de erori genereaz semnale de fapt, cele mai multe nu o fac. 0e exemplu, desc#iderea unui fiier inexistent este o eroare, dar nu genereaz un semnal/ n sc#im1, apelul de sistem open returneaz 8, indicnd c apelul s a terminat cu insucces" open returneaz 9 n caz de succes, ca ma4oritatea funciilor n Unix$. n general, erorile care sunt asociate cu anumite 1i1lioteci sunt raportate returnnd o valoare care indic o eroare. (rorile care genereaz semnale sunt cele care pot aprea oriunde n program, nu doar n apelurile din 1i1lioteci. (le includ mprirea cu zero i adresele de memorie invalide. Un eveniment extern este n general legat de +&, i alte procese. (le includ apariia de noi date de intrare, expirarea unui timer, i terminarea execuiei unui proces copil. , cerere explicit indic utilizarea unei funcii de 1i1iliotec cum ar fi -ill pentru a genera un semnal. Semnalele pot fi generate sincron sau asincron. Un semnal sincron se raporteaz la o aciune specific din program, i este trimis"dac nu este 1locat$ n timpul acelei aciuni. 2ele mai multe erori genereaz semnale n mod sincron, la fel ca anumite cereri explicite fcute de ctre un proces de a genera un semnal pentru acelai proces. 5e anumite maini, anumite tipuri de erori #ardware " de o1icei excepiile n virgul mo1il$ nu sunt raportate complet sincron, i pot a4unge cteva instruciuni mai trziu. Semnalele asincrone sunt generate de evenimente necontrola1ile de ctre procesul care le primete. 3ceste semnale a4ung la momente de timp impredicti1ile n timpul execuiei. (venimentele externe genereaz semnale n mod asincron, la fel ca i cererile explicite pentru alte procese. Un tip de semnal dat este fie sincron, fie asincron. 0e exemplu, semnalele pentru erori sunt n general sincrone deoarece erorile genereaz semnale n mod sincron. ns orice tip de semnal poate fi generat sincron sau asincron cu o cerere explicit.

Transmiterea i primirea semnalelor


2nd un semnal este generat, el intr ntr o stare de ateptare "pending$. n mod normal el rmne n aceast stare pentru o perioad de timp foarte mic i apoi este trimis procesului care era destinaia semnalului. ns, dac acel tip de semnal este n momentul de fa 1locat, el ar putea rmne n starea de ateptare n mod indefinit pn cnd semnalele de acel timp sunt de1locate. ,dat de1locat acel tip de semnale, el va fi trimis imediat. 2nd semnalul a fost primit, fie imediat sau dup o ntrziere mare, aciunea specificat pentru acel semnal este executat. 5entru anumite semnale. cum ar fi S+:'+66 i S+:S;,5, aciunea este fixat "procesul este terminat$, dar pentru ma4oritatea semnalelor programul poate alege s ignore semnalul, s specifice o funcie de tip #andler, sau s accepte aciunea implicit pentru tipul acela de semnal. 5rogramul i specific alegerea utiliznd funcii precum signal sau sigaction. n timp ce #andler ul ruleaz, acel tip de semnale este n mod normal 1locat "de1locarea se va face printr o cerere explicit n #andlerul care trateaz semnalul$. 0ac aciunea specificat pentru un tip de semnal este s l ignore, atunci orice semnal de acest tip care este generat pentru procesul n cauz este ignorat. 3celai lucru se ntmpl dac semnalul este 1locat n acel moment. Un semnal negli4at n acest mod nu va fi primit niciodata, nici dac programul specific ulterior o aciune diferit pentru acel tip de semnal i apoi l de1loc#eaz. 0ac este primit un semnal pentru care nu s a specificat niciun tip de aciune, se execut aciunea implicit. %iecare tip de semnal are propria lui aciune implicit. 5entru ma4oritatea semnalelor aciunea implicit este terminarea procesului. 5entru anumite tipuri de procese care reprezint evenimente fr consecine mari, aciunea implicit este s nu se fac nimic. 2nd un semnal foreaz terminarea unui proces, printele su poate determina cauza terminrii sale examinnd codul de terminare raportat de funciile wait i waitpid. +nformaiile pe care le poate o1ine includ faptul c terminarea procesului s a datorat unui semnal, precum i tipul semnalului. 0ac un program pe care l rulai din linia de comand este terminat de un semnal, s#ell ul printeaz de o1icei nite mesa4e de eroare. Semnalele care n mod normal reprezint erori de program au o proprietate special! cnd unul din aceste semnale termin procesul, el scrie i un fiier core dump care nregistreaz starea

procesului n momentul terminrii. 5utei examina fiierul cu un de1ugger pentru a afla ce anume a cauzat eroarea. 0ac generai un semnal care e in mod normal de tip eroare de program prin cerere explicit, i acesta termin procesul, fiierul este generat ca i cum semnalul ar fi fost generat de o eroare. +mportant! n cazul n care un semnal este trimis procesului n timp ce acesta executa un apel de sistem 1locant, procesul va suspenda apelul, va executa #andler ul de tratare i apoi fie operaia va eua "cu errno setat pe (+.;<$, fie se va restarta operaia.

Tipuri de semnale
Semnalele se mpart pe categorii, care corespund n general unor aciuni specifice. %iecare semnal are asociat un numr, iar acestor numere le corespund unele constante sim1olice definite n 1i1liotecile sistemului de operare (headerul <signal.h>). 6ista semnalelor poate fi o1inut i prin comanda kill l. %iecare nume de semnal este o macrodefiniie care reprezint de fapt un numr ntreg pozitiv * numrul pentru acel tip de semnal. Un program nu ar tre1ui s fac niciodat presupuneri despre codul numeric al unui tip particular de semnal, ci mai degra1, s le refere ntotdeauna prin nume. 3cest lucru se datoreaz faptului ca un numr pentru un tip de semnal poate varia de la sistem la sistem, dar numele sunt standard. 5entru lista completa de semnale suportate de un sistem se poate rula n linia de comanda
= -ill l 8$ S+:>U5 ?$ S+:+.; )$ S+:@U+; A$ S+:+66 B$ S+:;<35 C$ S+:3D<; E$ S+:DUS F$ S+:%5( G$ S+:'+66 89$ S+:US<8 88$ S+:S(:H 8?$ S+:US<? 8)$ S+:5+5( 8A$ S+:36<7 8B$ S+:;(<7 8E$ S+:2>60 8F$ S+:2,.; 8G$ S+:S;,5 ?9$ S+:;S;5 ?8$ S+:;;+. ??$ S+:;;,U ?)$ S+:U<: ?A$ S+:I25U ?B$ S+:I%SJ ?C$ S+:H;36<7 ?E$ S+:5<,% ?F$ S+:K+.2> ?G$ S+:+, )9$ S+:5K< )8$ S+:SLS ))$ S+:<;7+. )A$ S+:<;7+.M8 )B$ S+:<;7+.M? )C$ S+:<;7+.M) )E$ S+:<;7+.MA )F$ S+:<;7+.MB )G$ S+:<;7+.MC A9$ S+:<;7+.ME A8$ S+:<;7+.MF A?$ S+:<;7+.MG A)$ S+:<;7+.M89 AA$ S+:<;7+.M88 AB$ S+:<;7+.M8? AC$ S+:<;7+.M8) AE$ S+:<;7+.M8A AF$ S+:<;7+.M8B AG$ S+:<;73I 8B B9$ S+:<;73I 8A B8$ S+:<;73I 8) B?$ S+:<;73I 8? B)$ S+:<;73I 88 BA$ S+:<;73I 89 BB$ S+:<;73I G BC$ S+:<;73I F BE$ S+:<;73I E BF$ S+:<;73I C BG$ S+:<;73I B C9$ S+:<;73I A C8$ S+:<;73I ) C?$ S+:<;73I ? C)$ S+:<;73I 8 CA$ S+:<;73I

.umele de semnale sunt definite n #eader ul signal.h. n general semnalele au roluri predefinite, dar acestea pot fi suprascrise de programator. Semnalul S+:+.; este transmis la apsarea com1inaiei 2;<6M2, semnalul S+:@U+; n momentul apsrii com1inaiei de taste 2;<6MN, S+:S(:H n momentul accesrii unei locaii invalide de memorie etc. Semnalul S+:'+66 nu poate fi ignorat sau suprascris. ;ransmiterea acestui semnal are ca efect terminarea procesului indiferent de context. Dup fork() copilul nu motenete semnalele aflate n ateptare(pending) sau timerele. Semnale uzuale Semnale de terminare S+:;(<7 un mod OpoliticosP de a cere programului s si termine execuia S+:+.; program interrupt/ acest semnal este trimis procesului atunci cnd utilizatorul folosete 2;<6 2 S+:@U+; similar cu S+:+.; doar c este folosit com1inaia de taste 2;<6 N S+:'+66 procesul este imediat terminat/ acest semnal .U poate fi tratat ntr un mod special de ctre proces

S+:>U5 semnal generat de ctre sistemul de operare atunci cnd procesul este deconectat de la terminal "de exemplu atunci cnd lansm un proces pentru execuie n 1ac-ground i apoi facem logout/ aciunea implicit pentru S+:>U5 este de terminare a procesului/ dac vrem ca procesul s supravieuiasc tre1uie s 1locm acest semnal, folosind utilitarul no#up$. Semnale cauzate de erori ale programelor S+:%5( floating point exceptions, mprire la zero, depire. S+:+66 illegal instruction/ se ncearc execuia unei non instructiuni sau a unei instruciuni privilegiate. S+:S(:H segmentation violation/ programul ncearc s citeasc sau s scrie n afara regiunii de memorie alocate sau s scrie ntr o regiune de memorie read onlQ. "genereaz cele1rul mesa4 Segmentation fault$ S+:DUS ncercare de a accesa o adres invalid. S+:3D<; procesul a detectat o eroare intern i a apelat funcia a1ort"$ ;oate aceste semnale au ca aciune implicit terminarea procesului i generarea unui fiier core dump. 3cest fiier poate fi folosit de ctre un de1ugger mai trziu pentru analizarea cauzelor care au dus la terminarea anormal a procesului. Semnale de alarma S+:36<7 expirarea unui timer care msoar timp real/ timerul poate fi armat de funcia alarm"$ S+H;36<7 virtual time alarm/ expirarea unui timer care msoar timpul de procesor al procesului Semnale pentru controlul o!"urilor S+:2>60 se trimite atunci cnd unul din copiii procesului se termin sau este oprit/ aciunea implicit este de a ignora semnalul. S+:2,.; se trimite atunci cnd procesul a fost pornit, dup ce a fost oprit cu S+:S;,5/ acest semnal nu poate fi 1locat/ indiferent de rezultatul execuiei sale, procesul va fi pornit. S+:S;,5 * oprete un proces/ semnalul nu poate fi 1locat, ignorat sau tratat S+:;S;5 similar cu S+:S;,5, dar poate fi tratat sau ignorat/ se genereaz atunci cnd se tasteaz 2;<6 J. Semnale programa!ile S+:US<8 i S+:US<? pentru clase de evenimente definite de utilizator/ aciunea implicit este de terminare a procesului #tunci c$nd un proces este oprit% numai S&'(&)) i S&'*+,- pot fi trimise procesului. 3lte semnale sunt marcate ca pending "n ateptare$ i vor fi trimise cnd procesul i continu execuia. 5rocesele pot ignora, 1loca sau .prinde. toate semnalele cu excepia S+:S;,5 i S+:'+66. 0ac un proces RprindeR un semnal nseamn c include cod care va aciona corespunztor la primirea semnalului. 0aca semnalul nu este RprinsR de proces, -ernelul va executa aciunea implicit "default$. 5entru a trimite un semnal n mod expres unui proces se folosete comanda kill. 3ceasta primete ca argument 5+0 ul procesului i tipul de semnal pe care s l trimit "implicit trimite S+:;(<7"8B$$. S+:;(<7"8B$ se numete i soft -ill iar S+:'+66"G$ se numete #ard -ill. Un proces poate ignora semnalul 8B dar nu i semnalul G. 6a primirea semnalului 8B "daca nu este ignorat$ sau G procesul tre1uie s intre n starea terminated. -rimiterea semnalului S&'(&)) (/) lui init nu are niciun efect. 2omanda pkill primeste ca argument numele comenzii care ruleaz n procesul cruia ii va trimite semnalul. 2omanda killall se foloseste pentru a trimite semnale tuturor proceselor care ruleaz su1 acelasi nume. 0iferena ntre pkill i killall este ca pkill primete ca argument doar o parte din numele procesului, iar killall primete ca argument ntreg numele. 5entru a specifica semnalul trimis se poate folosi codul numeric al semnalului sau numele acestuia.

Job Control
So1 control se refera la posi1ilitatea de a opri&suspenda execuia unui proces i repornirea sa la un moment ulterior. 5entru a rula o comand n 1ac-ground se folosete RTR la sfritul comenzii. 01emplu
updatedb &

%iecare 4o1 care ruleaz n 1ac-ground primete un id "ncepnd cu 8$. 2omanda o!s afieaz toate aceste id uri su1 forma [1] 25647. 5rimul numr reprezint 2o! &D iar cel de al doilea 3rocess &D. 0ac sunt mai multe 4o1uri n 1ac-ground, semnul RMR identific 4o1 ul care va fi utilizat ca implicit n cazul comenzilor !g i fg, iar semnul R R identific 4o1 ul care devine default dac 4o1 ul curent termin execuia. 01emplu fg 4 o!5id " aduce n foreground un o! din !ackground. !g 4 o!5id 6 pornete n !ackground un o! suspendat cu *trl78 6a nc#iderea terminalului acesta primete semnalul S+:>U5. ;oate procesele pornite din terminal primesc la rndul lor semnalul S+:>U5. 2omanda nohup este folosit cnd se dorete ca un proces s nu reacioneze la primirea semnalului S+:>U5 "#angup$. 6a nc#iderea terminalului, printele "1as#$ intr n starea terminated i procesul este preluat de init. 01emplu nohup comanda 9 #plica:ie Se pornete un proces dintr un terminal n mod normal "fr nohup$ n foreground. Se dorete nc#iderea terminalului astfel nct procesul s i continue execuia. ;wget "c #ttp!&&download.fedorapro4ect.org&...&i)FC&iso&%edora F i)FC 0H0.iso ;*trl78 ; o!s ;!g 4 o!id ;disown "h 4 o!id

Functii i apeluri de sistem pentru lucrul cu semnale


kill()
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);

3ceast funcie este folosit pentru a trimite un semnal unui anumit proces sau grup de procese. n funcie de valoarea parametrului pid, execuia apelului va avea mai multe efecte/ pentru mai multe detalii accesai manpage ul kill(<). U pid V 9 * semnalul sig va fi trimis procesului pentru care 5+0 W pid. U pid W 9 * semnalul sig va fi trimis tuturor proceselor cu acelai :+0 ca i procesul ce a fcut apelul. U pid W 8 * semnalul sig va fi trimis tuturor proceselor din sistem cu excepia procesului init i a procesului ce a fcut apelul. U pid X 8 * trimite semnalul sig tuturor proceselor pentru care :+0W pid. 3olitica de tratare a semnalelor presupune restric:ionarea dreptului de a trimite semnale ctre orice proces din sistem. #stfel% pentru a e=ita terminarea unor procese care apar:in altor utilizatori% func:iile de lucru cu semnale permit transmiterea de semnale ntre procese nrudite 6 printe i copii. Singura e1cep:ie de la regul este n cazul n care se ruleaz un proces cu S0->&D setat(programul su). raise()
#include <signal.h> int raise(int sig);

3ceast funcie este folosit pentru a trimite un semnal ctre procesul curent. (xecuia ei este similar cu execuia urmtorului apel!
kill(getpid(), sig)

abort()
#include <stdlib.h> void abort(void);

3ceast funcie are ca efect trimiterea ctre procesul curent a unui semnal S+:3D<;, care are ca efect terminarea anormal a procesului, mai puin dac semnalul este tratat de o rutin care nu se termin. 0ac execuia lui a!ort() are ca efect terminarea procesului, toate fiierele desc#ise n interiorul acestuia vor fi nc#ise. (ste important de notat c, dac semnalul S+:3D<; este ignorat sau 1locat, execuia funciei nu va ine cont de acest lucru i procesul va fi terminat n mod anormal. alarm()
#include <unistd.h> unsigned int alarm(int seconds);

(xecuia acestei funcii are ca rezultat trimiterea, dup scurgerea unui numr de secunde dat de seconds, a unui semnal S+:36<7 ctre procesul curent. 0ac o alarm a fost de4a programat, ea este anulat n momentul execuiei ultimului apel, iar dac valoarea lui seconds este zero, nu va fi programat o alarm nou. n urma execuiei, se returneaz numrul de secunde rmase din alarma precedent, sau 9 daca nu era programat nici o alarm.

Tratarea semnalelor
signal() modalitatea prin care se realizeaz captarea semnalelor n scopul tratrii lor.
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);

(xecuia funciei va face ca, pentru semnalul cu numrul signum specificat ca i parametru, s se instaleze o noua rutin de tratare specificat prin parametrul handler . 3cest parametru tre1uie s ai1 tipul sighandler5t, care nseamn de fapt adresa unei funcii care nu returneaz

nicio valoare i are un singur parametru formal de tip intreg. 3cest parametru va primi ca valoare, n momentul execuiei rutinei de tratare a semnalului, numrul semnalului care se trateaz. 3cest lucru este util, de exemplu, atunci cnd se dorete tratarea mai multor tipuri de semnale folosind aceeai rutin. (xist dou valori speciale pentru parametrul handler, i anume! 8. S+:Y+:., care instruiete procesul s ignore semnalul specificat ,0?0*+@#,D#?. S+:Y0%6, care "re$seteaz tratarea semnalului la comportamentul implicit. 3pelul signal() returneaz rutina anterioar de tratare a semnalului, sau S+:Y(<< n caz de eroare. S+:Y(<< se returneaz de exemplu atunci cnd signum este S+:'+66 sau S+:S;,5, care sunt semnale ce nu pot fi nici captate, nici ignorate. 0e menionat faptul c pe durata rutinei de tratare, semnalul care a fost recepionat este 1locat i va fi eventual tratat la ieirea 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); }

;rimitei dintr un alt process "terminal$, pe rnd, semnalele S+:+.;, S+:;(<7 i S+:'+66. ,1servai i explicai efectele. Urmtorul su1paragraf va prezenta o metod de captare a semnalelor care ofera mai mult flexi1ilitate dect cea descris anterior, prin folosirea apelului sigaction() i a apelurilor asociate cu acesta. sigaction()
int sigaction(int signum, struct sigaction *act, sigaction *oldact);

3pelul sigaction() este similar cu signal(). (l are menirea de a defini comportarea procesului la primirea unui semnal. 3cest apel primete ca parametri numrul semnalului " signum$ i dou structuri de tip
struct sigaction * act //i oldact

(xecuia sa va avea ca efect instalarea noii aciuni pentru semnalul specificat din act "dac acest parametru este nenul$, i salvarea aciunii curente n oldact "la fel, dac parametrul este nenul$. Structura de tip struct sigaction este definit 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);

5arametrul sa5handler reprezint noua rutin de tratare a semnalului specificat, similar cu parametrul #andler prezentat la signal(). 3lternativ, dac n sa5flags este setat indicatorul S3YS+:+.%, "prezentat mai 4os$, se poate defini o rutin care primete trei parametri n loc de unul singur, i n acest caz ea se specific prin parametrul sa5sigaction. 5entru mai multe detalii legate de folosirea acestei din urm modaliti, consultai manpage ul sigaction(<). 5arametrul sa5sigaction reprezint #andlerul ce tre1uie setat n structur n cazul n care s a specificat flagul S3YS+:+.%,. >andlerul primete trei parametri. 5rimul parametru este numrul semnalului, al doilea este un pointer la o structur de tip siginfo5t ce conine informaii adiionale despre semnal. Ultimul parametru este un pointer la o structur ce indic contextul de dinaintea primirii semnalului "rar utilizat$. 0efiniia structurii siginfo5t 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 */ }

5arametrul sa5mask va specifica setul de semnale care vor fi 1locate n timpul execuiei rutinei de tratare a semnalului dat. 3cest parametru este de tipul sigset5t, care este de fapt o masc de 1ii, cu cte un 1it pentru fiecare semnal definit n sistem. ,peraiile asupra acestui tip de masc se realizeaz folosind funciile din familia sigsetops(A). 5arametrul sa5flags va specifica un set de indicatori care afecteaz comportarea operaiei de tratare a semnalelor. 3cest parametru se formeaz prin efectuarea unei operaii S3U logic folosind una sau mai multe din urmtoarele valori! S3Y.,260S;,5 daca signum este S+:2>60, procesul nu va primi un semnal S+:2>60 atunci cnd procesul fiu este suspendat "de exemplu cu S+:S;,5$, ci numai cnd acesta i termin execuia/ S3Y,.(S>,; sau S3Y<(S(;>3.0 va avea ca efect resetarea rutinei de tratare a semnalului la S+:Y0%6 dup prima rulare a rutinei, asemntor cu implementarea original a apelului signal()/ S3Y.,73S' sau S3Y.,0(%(< semnalul n discuie nu va fi inclus n sa5mask "comportamentul implicit este acela de a mpiedica apariia unui semnal n timpul execuiei rutinei de tratare a semnalului respectiv$/ S3YS+:+.%, se specific atunci cnd se dorete utilizarea lui sa5siginfo n loc de sa5handler 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 semnalelor 5entru a putea efectua operaii de 1locare&de1locare semnale avem nevoie s tim la fiecare pas n fluxul de execuie starea fiecrui semnal la acel moment. Sistemul de operare are de asemenea nevoie de acelai lucru pentru a putea face o decizie asupra unui semnal care tre1uie trimis unui proces "el are nevoie de acest gen de informaie pentru fiecare proces n parte$. n acest scop se foloseste o masc de semnale proprie fiecrui proces. , masc de semnale are fiecare 1it asociat unui tip de semnal. 7asca de 1ii este folosit de mai multe funcii, printre care i funcia sigprocmask folosit pentru sc#im1area mtii de semnale a procesului curent. ;ipul de date folosit de sistemele U.+I pentru a reprezenta mtile de semnale este sigset5t. Haria1ilele de acest tip sunt neiniializate. ,peraiile pe acest tip de date sunt de iniializare cu 1ii de 9 "toate semnalele ne1locate$ sau 1ii de 8 "toate semnalele 1locate$, de 1locare a unui semnal, de1locare i detectare a 1locrii unui semnal!
int int int int int sigemptyset(sigset_t *set); sigfillset(sigset_t *set); sigaddset(sigset_t *set, int signo); sigdelset(sigset_t *set, int signo); sigismember(sigset_t *set, int signo);

Secvena de mai 4os este un caz de utilizare a funciilor de lucru cu masca de semnale n care, la fiecare B secunde, se 1loc#eaz&de1loc#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);

3pelul sigprocmask() este folosit pentru a modifica lista semnalelor care sunt 1locate la un moment dat. 3cest lucru se face n funcie de valoarea parametrului how, astfel! 8. S+:YD6,2' adauga la lista semnalelor 1locate semnalele din lista set dat ca parametru/ ?. S+:YU.D6,2' terge din lista semnalelor 1locate semnalele aflate n lista set/ ). S+:YS(;73S' face ca doar semnalele din lista set s se regaseasc n lista semnalelor 1locate. 0aca parametrul oldest este nenul, n el se va memora valoarea listei semnalelor 1locate anterioar execuiei lui sigprocmask().
int sigpending(sigset_t *set);

3pelul sigpending() permite examinarea semnalelor care au aprut n timpul n care ele au fost 1locate, prin returnarea acestor semnale n masca set dat ca parametru.
int sigsuspend(const sigset_t *mask);

3pelul sigsuspend() nlocuiete temporar masca semnalelor 1locate a procesului cu cea dat n parametrul mask i suspend procesul pan la primirea unui semnal. 3pelurile sigaction(), sigprocmask() i sigpending() ntorc valoarea 9 n caz de succes i 8 n caz de eroare. 3pelul sigsuspend() ntoarce ntotdeauna 8, iar n mod normal varia1ila errno este setat la valoarea (+.;<. Semnalarea proceselor cu !unc"ia sig#ueue() %uncia kill() nu garanteaz faptul c semnalul a a4uns la destinaie i nu ofer niciun mecanism prin care s se verifice acest lucru. 0aca avem nevoie s trimitem un semnal unui proces i s stim sigur c a a4uns putem utiliza funcia sigBueue() !
int sigqueue(pid_t pid, int signo, const union sigval value);

U pid 5+0 ul procesului cruia i se va trimite semnalul U signo semnalul ce va fi trimis U =alue o valoare ce va fi trimis odat cu semnalul

%uncia trimite semnalul signo cu valoarea specificat de =alue procesului cu identificatorul pid. Haloarea ce poate fi trimis odat cu semnalul este o uniune de forma!
union sigval { int sival_int; void *sival_ptr; };

Un parametru trimis astfel apare n campul si5=alue al structurii siginfo5t primite de #andler ul de semnal. 0ac semnalul specificat este 1locat n acel moment, funcia va iei imediat/ dac flagul S3YS+:+.%, este setat i exist resurse necesare, semnalul va fi pus n coad n starea pending "un proces poate avea n coada de pending maxim S+:@U(U(Y73I semnale$. 3tunci cnd semnalul este primit, cmpul si5code pasat structurii siginfo va fi setat la S+Y@U(U(. 0ac nu exist resurse necesare pentru a trimite semnalul "i.e., dac toate cele S+:@U(U(Y73I locuri n coad sunt ocupate$ funcia esueaz. 0ac flagul S3YS+:+.%, nu este setat, atunci signo, dar nu n mod necesar i =alue vor fi trimise cel puin o dat procesului care tre1uie s primeasc semnalul. $teptarea unui semnal n cazul n care se utilizeaz semnalele pentru comunicare i&sau sincronizare exist adeseori nevoie s se atepte ca un anumit tip de semnal s parvin procesului n cauz. Un simplu mod de a realiza acest lucru este o 1ucl a crei condiie de ieire ar fi setarea corespunztoare a unei varia1ile "varia1ila tre1uie sa fie de tipul sig5atomic5t$.
while (!signal_has_arrived);

5rincipalul dezavanta4 al a1ordrii de mai sus "de tip 1usQ waiting$ este timpul de procesor pe care procesul considerat l pierde n mod inutil. , alternativ ar fi folosirea funciei sleep!
while (!signal_has_arrived) { sleep(1); }

, astfel de a1ordare nu ar mai ocupa timp de procesor inutil, dar timpul de rspuns n cazul sosirii unui semnal este destul de mare. , alt soluie a pro1lemei este funcia pause() care 1loc#eaz fluxul de execuie pn cnd procesul curent este ntrerupt de un semnal. 0ei aceast a1ordare pare foarte simpl, ea introduce adeseori deadloc- uri care 1loc#eaz programul nedefinit.
while (!signal_has_arrived) { pause(); }

Ducla este necesar pentru prevenirea situaiei n care procesul este ntrerupt de alte semnale dect cel ateptat. Se poate ntmpla ca semnalul s a4ung dup testarea varia1ilei i nainte de apelul funciei pause. n acest caz procesul se 1loc#eaz i, dac nu apare un alt semnal care s cauzeze ieirea din pause, el va ramne 1locat nedefinit. Soluia cea mai 1un pentru a atepta un semnal se poate realiza prin utilizarea funciei
int sigsuspend(const sigset_t *set);

%uncia nlocuiete masca de semnale 1locate a procesului cu set i apoi suspend procesul pn cnd este primit un semnal care nu este 1locat de noua masc. 6a ieire, funcia restaureaz vec#ea masc de semnale. n secvena de mai 4os, funcia sigsuspend() este folosit pentru a ntrerupe procesul curent pna la recepionarea semnalului S+:US<8. Semnalele S+:'+66 i S+:S;,5, dei prezente n masca de semnale, nu vor fi 1locate!
... sigset_t set; /* block all signals except SIGINT */ sigfillset(&set); sigdelset(&set, SIGINT); /* wait for SIGINT */ sigsuspend(&set); ...

Timere i sleep n 6inux, folosirea timer elor este legat de folosirea semnalelor. 3cest lucru se ntmpl ntruct cea mai mare parte a funciilor de tip timer folosesc semnale. Un timer este, de o1icei, un ntreg a crui valoare este decrementat pe parcursul trecerii timpului. n momentul n care ntregul a4unge la 9, timer ul expir. n 6inux, rezultatul expirrii timer ului, este, n general, transmiterea unui semnal. 0efinirea unui Rtimer #andlerR "rutin apelat n momentul expirrii timer ului$ este, astfel, ec#ivalent cu definirea unui #andler pentru semnalul asociat. nregistrarea unui timer n 6inux nseamn specificarea unui interval dup care un timer expir i configurarea #andler ului care va rula. %iind vor1a de semnale, configurarea #andler ului se realizeaz prin intermediul funciei sigaction(). Specificarea unui interval de timeout se realiz folosind funcia alarm() sau setitimer(). 3pelul alarm() este mai simplu, dar ofer granularitate la nivel de secund. 6a expirarea timeout ului, se transmite semnalul S+:36<7. 3pelul setitimer() este mai complex, dar ofer granularitate la nivel de microsecund. n funcie de primul argument se vor livra semnalele S+:36<7, S+:H;36<7 respectiv S+:5<,%. "citii man page urile celor ? funcii$ 7ai 4os este prezentat o secven de cod de folosire a funciilor alarm() i setitimer()
#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 funciilor de ateptare de tipul sleep() sau nanosleep(). 3vanta4ul folosirii funciei sleep() este simplitatea. 0ezavanta4ele sunt rezoluia sczut "secunde$ i posi1ila interaciune cu semnale "n special S+:36<7$. nanosleep() are un apel mai

complex, dar ofer rezoluie pna la ordinul nanosecundelor i este Rsignal safeR interacioneaz cu semnale.

nu

Tratarea semnalelor
0e o1icei, #andlerele "funciile&rutinele de tratare a semnalelor$ nu presupun foarte multe aciuni&instruciuni. (ste o practic 1un s se construiasc #andlere care doar s modifice doar o varia1il, lsnd alte instruciuni dorite a se executa la apariia unui semnal c#iar n sarcina programului. 3sta deoarece un semnal poate fi recepionat asincron, la momente de timp total nepredicti1ile ceea ce poate duce c#iar la structuri de date inconsistente. Func"ii reentrante 0e asemenea, este recomandat ca eventualele apeluri de funcii din interiorul #andlerelor s fie pentru !unc"ii reentrante "pot fi ntrerupte n timpul execuiei i apoi reapelate fr pro1leme * semnale, zone de memorie alocate&utilizate etc$. , funcie poate fi non reentrant dac folosete date care nu sunt pe stiv utilizarea unei varia1ile&referine static sau glo1al poate duce la apeluri ale aceleiai funcii care s interfereze "ex. operaii de +&, cu streamuri * #andler care scrie ntr un fiier$. 3ceast pro1lem poate fi ntlnit atunci cnd se dorete alocarea&eli1erarea dinamic de memorie "malloc,free * non reentrante$. 0e asemenea, orice funcie care modific errno este non reentrant. %ariabile atomice 3ccesul individual la date nu este neaprat atomic"pot fi necesare mai multe instruciuni pentru a modifica astfel de date$. 3stfel, un #andler poate rula ntre ? etape ale unei citiri&scrieri de date. 5entru aceasta se poate scrie codul n aa fel nct nimic s nu poat interfera n momente c#eie ale execuiei, se pot 1loca semnale sau se pot utiliza date cu acces atomic"date atomice$. 2itirea&scrierea unei varia1ile sig_atomic_t este garantat a se executa ntr o singur instruciune, un #andler neputndu se executa n mi4locul unei astfel de operaiuni. , varia1il sig5atomic5t este n general de tipul ntreg ns dimensiunea poate varia de la o platform la alta. n practic, se poate considera c o varia1il int sau un pointer sunt tipuri de date atomice. , alt a1ordare este aceea a prote4rii oricrui tip de date sau oricrei seciuni de cod prin limitarea accesului prin intermediul unor o1iecte asupra crora se pot efectua numai aciuni atomice * mutexuri i semafoare. Semnale &eal'time 5,S+I permite utilizarea semnalelor real time de ctre programator i nu au o aciune specific predefinit "S+:<;7+. i S+:<;73I $. Spre deose1ire de celelate semnale disponi1ile n sistem, un semnal <; poate avea mai multe instane puse n coada de ateptare a unui proces. 7ai mult dect att, ordinea livrrii semnalelor este garantat. Fork Un proces copil i ncepe execuia fr a avea vreun semnal n coada de ateptare c#iar dac printele avea puse n coada proprie anumite semnale la momentul apelului fork(). >andlerele de semnale i semnalele 1locate sunt motenite de ctre procesul copil. 3tri1utele descriptorilor de fiiere relative la semnale sunt, de asemenea, motenite. T(reads 3vnd n vedere c, n cazul unui program multi t#readed, toate t#readurile ruleaz su1 acelai 5+0, se pune pro1lema identificrii t#readului care tre1uie s trateze orice semnal primit de procesul de care aparine. n cazul .ative 5,S+I ;#reads 6i1rarQ ".5;6$, versiune disponi1ili din ?99A, exist ? situaii distincte! a$ Semnale adresate proceselor "trimise cu apelul kill() ctre un 5+0 cunoscut$

;#readurile unui proces au propria masc de semnale ce poate fi modificat folosind apelul pthread5sigmask(), asemntor cu sigprocmask(). 3stfel, dac un semnal transmis unui proces, acesta va fi livrat, n mod aleatoriu, unuia dintre t#readurile din cadrul procesului care nu au 1locat acest semnal. 0ac toate t#readurile au semnalul 1locat, atunci acesta este pus n coada de ateptare a procesului. 1$ Semnale adresate threadurilor "trimise cu apelul pthread5kill()$ Se pot astfel transmite&recepiona semnale, separat, pentru fiecare t#read n parte. 3stfel, un t#read poate trimite altui t#read un semnal, dar poate s i activeze un semnal pentru el nsui. (xist i semnale de sistem generate pentru un t#read anume "S+:S(:H$. 3cest lucru presupune existena unei cozi de ateptare pentru semnale pentru fiecare t#read n parte. 0ac nu exist definit un #andler pentru un semnal adresat unui t#read, iar aciunea implicit este terminarea execuiei ntregului proces, procesul de care aparine t#readul i va nc#eia execuia. 3pelul raise() presupune trimiterea unui semnal ctre t#readul apelant. n concluzie, handlerele&rutinele de tratare sunt atribute valabile la nivelul unui proces . 3stfel, ntr un program multi t#readed, #andlerele sunt aceleai pentru toate t#readurile procesului.

(I(756( 8. 5ro1lema productor * 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; }

?. +52 "+nter 5rocess 2ommunication$ cu semnale * S+:US<8, S+:US<?


/* 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); } */ /* Busy wait for the signal. */ while (!usr_interrupt) ; child to send a */ 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 (); return. */ */

/*

Does

not

/* Now continue execution. */ puts ("That's all, folks!"); return 0; }

). +lustreaz folosirea semnalului S+:36<7


char 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; }

A.
#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;

Z B.
/* Global variables that control 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); process 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); /* 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 */ }

C. S se scrie un program care ilustreaz modurile de tratare ale unui semnal. "S+:36<7,S+:US<8,S+:+.;,S+:@U+;$
#include <signal.h> // directiva ce contine numele tuturor semnalelor precum si prototipul kill() #include <hdr.h> static static static static void void void void sig_usr1( int); sig_intr( int); sig_quit( int); sig_alarm(int); /* /* /* /* generat generat generat generat cu kill USR1 <pid */ la Ctrl-C si rearmat */ cu Ctrl-\ si resetat */ 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; }

E. .

ANEX
Standard Signals
;#is section lists t#e names for various standard -inds of signals and descri1es w#at -ind of event t#eQ mean. (ac# signal name is a macro w#ic# stands for a positive integer t#e signal num!er for t#at -ind of signal. Lour programs s#ould never ma-e assumptions a1out t#e numeric code for a particular -ind of signal, 1ut rat#er refer to t#em alwaQs 1Q t#e names defined #ere. ;#is is 1ecause t#e num1er for a given -ind of signal can varQ from sQstem to sQstem, 1ut t#e meanings of t#e names are standardized and fairlQ uniform. ;#e signal names are defined in t#e #eader file `signal.h'. 7acro! int )S*+ ;#e value of t#is sQm1olic constant is t#e total num1er of signals defined. Since t#e signal num1ers are allocated consecutivelQ, NSIG is also one greater t#an t#e largest defined signal num1er. rogram !rror Signals ;#e following signals are generated w#en a serious program error is detected 1Q t#e operating sQstem or t#e computer itself. +n general, all of t#ese signals are indications t#at Qour program is seriouslQ 1ro-en in some waQ, and t#ere[s usuallQ no waQ to continue t#e computation w#ic# encountered t#e error. Some programs #andle program error signals in order to tidQ up 1efore terminating/ for example, programs t#at turn off ec#oing of terminal input s#ould #andle program error signals in order to turn ec#oing 1ac- on. ;#e #andler s#ould end 1Q specifQing t#e default action for t#e signal t#at #appened and t#en reraising it/ t#is will cause t#e program to terminate wit# t#at signal, as if it #ad not #ad a #andler. "See section >andlers ;#at ;erminate t#e 5rocess.$ ;ermination is t#e sensi1le ultimate outcome from a program error in most programs. >owever, programming sQstems suc# as 6isp t#at can load compiled user programs mig#t need to -eep executing even if a user program incurs an error. ;#ese programs #ave #andlers w#ic# use long4mp 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 Qou 1loc- or ignore t#ese signals or esta1lis# #andlers for t#em t#at return normallQ, Qour program will pro1a1lQ 1rea- #orri1lQ w#en suc# signals #appen, unless t#eQ are generated 1Q raise or -ill instead of a real error. K#en one of t#ese program error signals terminates a process, it also writes a core dump file w#ic# records t#e state of t#e process at t#e time of termination. ;#e core dump file is named `core' and is written in w#ic#ever directorQ is current in t#e process at t#e time. ",n t#e :.U sQstem, Qou can specifQ t#e file name for core dumps wit# t#e environment varia1le COREFILE.$ ;#e purpose of core dump files is so t#at Qou can examine t#em wit# a de1ugger to investigate w#at caused t#e error. 7acro! int S*+F,;#e S+:%5( signal reports a fatal arit#metic error. 3lt#oug# t#e name is derived from Rfloating point exceptionR, t#is signal actuallQ covers all arit#metic errors, including division 1Q zero and overflow. +f a program stores integer data in a location w#ic# is t#en used in a floating point operation, t#is

often causes an Rinvalid operationR exception, 1ecause t#e processor cannot recognize t#e data as a floating point num1er. 3ctual floating point exceptions are a complicated su14ect 1ecause t#ere are manQ tQpes of exceptions wit# su1tlQ different meanings, and t#e S+:%5( signal doesn[t distinguis# 1etween t#em. ;#e &000 Standard for CinarD Eloating"3oint #rithmetic (#,S&F&000 Std GHI"J/KH) defines various floating point exceptions and re\uires conforming computer sQstems to report t#eir occurrences. >owever, t#is standard does not specifQ #ow t#e exceptions are reported, or w#at -inds of #andling and control t#e operating sQstem can offer to t#e programmer. DS0 sQstems provide t#e SIGFPE #andler wit# an extra argument t#at distinguis#es various causes of t#e exception. +n order to access t#is argument, Qou must define t#e #andler to accept two arguments, w#ic# means Qou must cast it to a one argument function tQpe in order to esta1lis# t#e #andler. ;#e :.U li1rarQ does provide t#is extra argument, 1ut t#e value is meaningful onlQ on operating sQstems t#at provide t#e information "DS0 sQstems and :.U sQstems$.
%5(Y+.;,H%Y;<35

+nteger overflow "impossi1le in a 2 program unless Qou ena1le overflow trapping in a #ardware specific fas#ion$.
%5(Y+.;0+HY;<35

+nteger division 1Q zero.


%5(YSUD<.:Y;<35

Su1script range "somet#ing t#at 2 programs never c#ec- for$.


%5(Y%6;,H%Y;<35

%loating overflow trap.


%5(Y%6;0+HY;<35

%loating&decimal division 1Q zero.


%5(Y%6;U.0Y;<35

%loating underflow trap. ";rapping on floating underflow is not normallQ ena1led.$


%5(Y0(2,H%Y;<35

0ecimal overflow trap. ",nlQ a few mac#ines #ave decimal arit#metic and 2 never uses it.$ 7acro! int S*+*.. ;#e name of t#is signal is derived from Rillegal instructionR/ it means Qour program is trQing to execute gar1age or a privileged instruction. Since t#e 2 compiler generates onlQ valid instructions, SIGILL tQpicallQ indicates t#at t#e executa1le file is corrupted, or t#at Qou are trQing to execute data. Some common waQs of getting into t#e latter situation are 1Q passing an invalid o14ect w#ere a pointer to a function was expected, or 1Q writing past t#e end of an automatic arraQ "or similar pro1lems wit# pointers to automatic varia1les$ and corrupting ot#er data on t#e stac- suc# as t#e return address of a stac- frame. 7acro! int S*+S-+%

;#is signal is generated w#en a program tries to read or write outside t#e memorQ t#at is allocated for it. "3ctuallQ, t#e signals onlQ occur w#en t#e program goes far enoug# outside to 1e detected 1Q t#e sQstem[s memorQ protection mec#anism.$ ;#e name is an a11reviation for Rsegmentation violationR. ;#e most common waQ of getting a S+:S(:H condition is 1Q dereferencing a null or uninitialized pointer. 3 null pointer refers to t#e address 9, and most operating sQstems ma-e sure t#is address is alwaQs invalid preciselQ so t#at dereferencing a null pointer will cause S+:S(:H. "Some operating sQstems place valid memorQ at address 9, and dereferencing a null pointer does not cause a signal on t#ese sQstems.$ 3s for uninitialized pointer varia1les, t#eQ contain random addresses w#ic# maQ or maQ not 1e valid. 3not#er common waQ of getting into a SIGSEGV situation is w#en Qou use a pointer to step t#roug# an arraQ, 1ut fail to c#ec- for t#e end of t#e arraQ. 7acro! int S*+ /S ;#is signal is generated w#en an invalid pointer is dereferenced. 6i-e S+:S(:H, t#is signal is tQpicallQ t#e result of dereferencing an uninitialized pointer. ;#e difference 1etween t#e two is t#at S+:S(:H indicates an invalid access to valid memorQ, w#ile S+:DUS indicates an access to an invalid address. +n particular, S+:DUS signals often result from dereferencing a misaligned pointer, suc# as referring to a four word integer at an address not divisi1le 1Q four. "(ac# -ind of computer #as its own re\uirements for address alignment.$ ;#e name of t#is signal is an a11reviation for R1us errorR. 7acro! int S*+$ &T ;#is signal indicates an error detected 1Q t#e program itself and reported 1Q calling abort. See section 31orting a 5rogram. Termination Signals ;#ese signals are all used to tell a process to terminate, in one waQ or anot#er. ;#eQ #ave different names 1ecause t#eQ[re used for slig#tlQ different purposes, and programs mig#t want to #andle t#em differentlQ. ;#e reason for #andling t#ese signals is usuallQ so Qour program can tidQ up as appropriate 1efore actuallQ terminating. %or example, Qou mig#t want to save state information, delete temporarQ files, or restore t#e previous terminal modes. Suc# a #andler s#ould end 1Q specifQing t#e default action for t#e signal t#at #appened and t#en reraising it/ t#is will cause t#e program to terminate wit# t#at signal, as if it #ad not #ad a #andler. "See section >andlers ;#at ;erminate t#e 5rocess.$ ;#e "o1vious$ default action for all of t#ese signals is to cause t#e process to terminate. 7acro! int S*+0/, ;#e S+:>U5 "R#ang upR$ signal is used to report t#at t#e user[s terminal is disconnected, per#aps 1ecause a networ- or telep#one connection was 1ro-en. %or more information a1out t#is, see section 2ontrol 7odes. ;#is signal is also used to report t#e termination of t#e controlling process on a terminal to 4o1s associated wit# t#at session/ t#is termination effectivelQ disconnects all processes in t#e session from t#e controlling terminal. %or more information, see section ;ermination +nternals.

7acro! int S*+*)T ;#e SIGINT "Rprogram interruptR$ signal is sent w#en t#e user tQpes t#e +.;< c#aracter "normallQ C c$. See section Special 2#aracters, for information a1out terminal driver support for C c. 7acro! int S*+1/*T ;#e S+:@U+; signal is similar to S+:+.;, except t#at it[s controlled 1Q a different -eQ t#e @U+; c#aracter, usuallQ 2 N and produces a core dump w#en it terminates t#e process, 4ust li-e a program error signal. Lou can t#in- of t#is as a program error condition RdetectedR 1Q t#e user. See section 5rogram (rror Signals, for information a1out core dumps. See section Special 2#aracters, for information a1out terminal driver support. 2ertain -inds of cleanups are 1est omitted in #andling SIG!UIT. %or example, if t#e program creates temporarQ files, it s#ould #andle t#e ot#er termination re\uests 1Q deleting t#e temporarQ files. Dut it is 1etter for SIG!UIT not to delete t#em, so t#at t#e user can examine t#em in con4unction wit# t#e core dump. 7acro! int S*+T-&2 ;#e S+:;(<7 signal is a generic signal used to cause program termination. Unli-e S+:'+66, t#is signal can 1e 1loc-ed, #andled, and ignored. ;#e s#ell command "ill generates SIGTER# 1Q default. 7acro! int S*+3*.. ;#e S+:'+66 signal is used to cause immediate program termination. +t cannot 1e #andled or ignored, and is t#erefore alwaQs fatal. +t is also not possi1le to 1loc- t#is signal. ;#is signal is generated onlQ 1Q explicit re\uest. Since it cannot 1e #andled, Qou s#ould generate it onlQ as a last resort, after first trQing a less drastic met#od suc# as 2 c or S+:;(<7. +f a process does not respond to anQ ot#er termination signals, sending it a S+:'+66 signal will almost alwaQs cause it to go awaQ. +n fact, if SIG$ILL fails to terminate a process, t#at 1Q itself constitutes an operating sQstem 1ug w#ic# Qou s#ould report. "larm Signals ;#ese signals are used to indicate t#e expiration of timers. See section Setting an 3larm, for information a1out functions t#at cause t#ese signals to 1e sent. ;#e default 1e#avior for t#ese signals is to cause program termination. ;#is default is rarelQ useful, 1ut no ot#er default would 1e useful/ most of t#e waQs of using t#ese signals would re\uire #andler functions in anQ case. 7acro! int S*+$.&2 ;#is signal tQpicallQ indicates expiration of a timer t#at measures real or cloc- time. +t is used 1Q t#e alar% function, for example. 7acro! int S*+%T$.&2

;#is signal tQpicallQ indicates expiration of a timer t#at measures 25U time used 1Q t#e current process. ;#e name is an a11reviation for Rvirtual time alarmR. 7acro! int S*+,&4F ;#is signal is tQpicallQ indicates expiration of a timer t#at measures 1ot# 25U time used 1Q t#e current process, and 25U time expended on 1e#alf of t#e process 1Q t#e sQstem. Suc# a timer is used to implement code profiling facilities, #ence t#e name of t#is signal. "s#nchronous $%& Signals ;#e signals listed in t#is section are used in con4unction wit# asQnc#ronous +&, facilities. Lou #ave to ta-e explicit action 1Q calling &cntl to ena1le a particular file descriptior to generate t#ese signals "see section +nterrupt 0riven +nput$. ;#e default action for t#ese signals is to ignore t#em. 7acro! int S*+*4 ;#is signal is sent w#en a file descriptor is readQ to perform input or output. ,n most operating sQstems, terminals and soc-ets are t#e onlQ -inds of files t#at can generate SIGIO/ ot#er -inds, including ordinarQ files, never generate SIGIO even if Qou as- t#em to. 7acro! int S*+/&+ ;#is signal is sent w#en RurgentR or out of 1and data arrives on a soc-et. See section ,ut of Dand 0ata. 'ob (ontrol Signals ;#ese signals are used to support 4o1 control. +f Qour sQstem doesn[t support 4o1 control, t#en t#ese macros are defined 1ut t#e signals t#emselves can[t 1e raised or #andled. Lou s#ould generallQ leave t#ese signals alone unless Qou reallQ understand #ow 4o1 control wor-s. See section So1 2ontrol. 7acro! int S*+C0.5 ;#is signal is sent to a parent process w#enever one of its c#ild processes terminates or stops. ;#e default action for t#is signal is to ignore it. +f Qou esta1lis# a #andler for t#is signal w#ile t#ere are c#ild processes t#at #ave terminated 1ut not reported t#eir status via 'ait or 'ait(i) "see section 5rocess 2ompletion$, w#et#er Qour new #andler applies to t#ose processes or not depends on t#e particular operating sQstem. 7acro! int S*+C4)T Lou can send a S+:2,.; signal to a process to ma-e it continue. ;#e default 1e#avior for t#is signal is to ma-e t#e process continue if it is stopped, and to ignore it ot#erwise. 7ost programs #ave no reason to #andle SIGCONT/ t#eQ simplQ resume execution wit#out realizing t#eQ were ever stopped. Lou can use a #andler for SIGCONT to ma-e a program do somet#ing special w#en it is stopped and continued for example, to reprint a prompt w#en it is suspended w#ile waiting for input. 7acro! int S*+ST4,

;#e SIGSTOP signal stops t#e process. +t cannot 1e #andled, ignored, or 1loc-ed. 7acro! int S*+TST, ;#e S+:;S;5 signal is an interactive stop signal. Unli-e S+:S;,5, t#is signal can 1e #andled and ignored. Lour program s#ould #andle t#is signal if Qou #ave a special need to leave files or sQstem ta1les in a secure state w#en a process is stopped. %or example, programs t#at turn off ec#oing s#ould #andle S+:;S;5 so t#eQ can turn ec#oing 1ac- on 1efore stopping. ;#is signal is generated w#en t#e user tQpes t#e SUS5 c#aracter "normallQ C *$. %or more information a1out terminal driver support, see section Special 2#aracters. 7acro! int S*+TT*) 3 process cannot read from t#e t#e user[s terminal w#ile it is running as a 1ac-ground 4o1. K#en anQ process in a 1ac-ground 4o1 tries to read from t#e terminal, all of t#e processes in t#e 4o1 are sent a SIGTTIN signal. ;#e default action for t#is signal is to stop t#e process. %or more information a1out #ow t#is interacts wit# t#e terminal driver, see section 3ccess to t#e 2ontrolling ;erminal. 7acro! int S*+TT4/ ;#is is similar to S+:;;+., 1ut is generated w#en a process in a 1ac-ground 4o1 attempts to write to t#e terminal or set its modes. 3gain, t#e default action is to stop t#e process. K#ile a process is stopped, no more signals can 1e delivered to it until it is continued, except S+:'+66 signals and "o1viouslQ$ S+:2,.; signals. ;#e S+:'+66 signal alwaQs causes termination of t#e process and can[t 1e 1loc-ed or ignored. Lou can 1loc- or ignore S+:2,.;, 1ut it alwaQs causes t#e process to 1e continued anQwaQ if it is stopped. Sending a S+:2,.; signal to a process causes anQ pending stop signals for t#at process to 1e discarded. 6i-ewise, anQ pending S+:2,.; signals for a process are discarded w#en it receives a stop signal. K#en a process in an orp#aned process group "see section ,rp#aned 5rocess :roups$ receives a SIGTSTP, SIGTTIN, or SIGTTOU signal and does not #andle it, t#e process does not stop. Stopping t#e process would 1e unreasona1le since t#ere would 1e no waQ to continue it. K#at #appens instead depends on t#e operating sQstem Qou are using. Some sQstems maQ do not#ing/ ot#ers maQ deliver anot#er signal instead, suc# as SIG$ILL or SIG+UP. )iscellaneous Signals ;#ese signals are used to report various ot#er conditions. ;#e default action for all of t#em is to cause t#e process to terminate. 7acro! int S*+,*,+f Qou use pipes or %+%,s, Qou #ave to design Qour application so t#at one process opens t#e pipe for reading 1efore anot#er starts writing. +f t#e reading process never starts, or terminates unexpectedlQ, writing to t#e pipe or %+%, raises a S+:5+5( signal. +f S+:5+5( is 1loc-ed, #andled or ignored, t#e offending call fails wit# (5+5( instead. 5ipes and %+%, special files are discussed in more detail in section 5ipes and %+%,s. 3not#er cause of SIGPIPE is w#en Qou trQ to output to a soc-et t#at isn[t connected. See section Sending 0ata.

7acro! int S*+/S&6 7acro! int S*+/S&7 ;#e S+:US<8 and S+:US<? signals are set aside for Qou to use anQ waQ Qou want. ;#eQ[re useful for interprocess communication. Since t#ese signals are normallQ fatal, Qou s#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 SIGUSR1 and SIGUSR, in section Signaling 3not#er 5rocess. *onstandard Signals 5articular operating sQstems support additional signals not listed a1ove. ;#e 3.S+ 2 standard reserves all identifiers 1eginning wit# ]S+:[ followed 1Q an uppercase letter for t#e names of signals. Lou s#ould consult t#e documentation or #eader files for Qour particular operating sQstem and processor tQpe to find out a1out t#e specific signals it supports. %or example, some sQstems support extra signals w#ic# correspond to #ardware traps. Some ot#er -inds of signals commonlQ supported are used to implement limits on 25U time or file sQstem usage, asQnc#ronous c#anges to terminal configuration, and t#e li-e. SQstems maQ also define signal names t#at are aliases for standard signal names. Lou can generallQ assume t#at t#e default action "or t#e action set up 1Q t#e s#ell$ for implementation defined signals is reasona1le, and not worrQ a1out t#em Qourself. +n fact, it[s usuallQ a 1ad idea to ignore or 1loc- signals Qou don[t -now anQt#ing a1out, or trQ to esta1lis# a #andler for signals w#ose meanings Qou don[t -now. >ere are some of t#e ot#er signals found on commonlQ used operating sQstems!
S+:260

,1solete name for S+:2>60.


S+:;<35

:enerated 1Q t#e mac#ine[s 1rea-point instruction. Used 1Q de1uggers. 0efault action is to dump core.
S+:+,;

:enerated 1Q t#e 505 88 RiotR instruction/ e\uivalent to S+:3D<;. 0efault action is to dump core.
S+:(7;

(mulator trap/ t#is results from certain unimplemented instructions. +t is a program error signal.
S+:SLS

Dad sQstem call/ t#at is to saQ, t#e instruction to trap to t#e operating sQstem was executed, 1ut t#e code num1er for t#e sQstem call to perform was invalid. ;#is is a program error signal.
S+:5,66

;#is is a SQstem H signal name, more or less similar to S+:+,.


S+:I25U

25U time limit exceeded. ;#is is used for 1atc# processing. 0efault action is program termination.
S+:I%SJ

%ile size limit exceeded. ;#is is used for 1atc# processing. 0efault action is program termination.
S+:K+.2>

Kindow size c#ange. ;#is is generated on certain sQstems w#en t#e size of t#e current window on t#e screen is c#anged. 0efault action is to ignore it.

S-ar putea să vă placă și