Vous êtes sur la page 1sur 10

10. Relaii ntre procese.

Semnale

Cuprins
Procedura de login Grupuri de procese, sesiuni, terminale de control Semnale
Definiii Apelul sistem signal. Semnale nefiabile Apeluri sistem ntreruptibile. Funcii reentrante Semnale fiabile Seturi de semnale. Apeluri specifice

10.1. Procedura de login


La terminarea ncrcrii prii rezidente a sistemului se creeaz procesul cu pid=1, init, care trece sistemul n modul de operare multiutilizator init citete informaiile din fiierul de configurare /etc/ttys, care are cte o linie pentru fiecare terminal din sistem Pentru fiecare terminal care permite login, init va apela fork, urmat de un exec pentru programul getty. Toate aceste procese au privilegii de root i ambian vid Programul getty apeleaz open pentru terminal, n modul read/write. Dup revenirea din open descriptorii de fiier 0, 1 i 2 sunt conectai la terminal, iar n continuare getty afieaz la terminal textul login: i ateapt ca utilizatorul s introduc un nume de login

init
apel fork pt. fiec. terminal

init fork init

fork

init
desch. term. cit. nume constr. amb.

fiecare fiu exec. getty

getty

getty

login

10.2. Grupuri de procese, sesiuni, terminale de control (1)


Grup de procese: colecie de unul sau mai multe procese, cu identificator unic. Fiecare grup poate avea lider, cu PID-ul egal cu identificatorul de grup Un lider de grup poate crea un grup de procese, apoi procese membri n grup, dup care s se termine. Grupul exist ct timp mai are membri. Prsirea grupului se face prin terminarea procesului sau ataarea la alt grup Ataarea la un grup sau crearea unui grup nou se face prin: int setpgid(pid_t pid, pid_t pgid); Identificatorul de grup pentru pid devine pgid; dac argumentele sunt egale, pid devine liderul unui nou grup. Apelul returneaz 0 la succes i -1 la eroare. Un proces poate modifica grupul pentru el i fiii si. Dac unul dintre fii a apelat exec, nu i se mai poate modifica grupul. Dac pid este 0 se folosete pid-ul apelantului; dac pgid este 0 se folosete ca valoare pid Apelul sistem: pid_t getpgrp(void); permite unui proces s i afle grupul de procese (valoarea returnat de apel) Sesiune: colecie de unul sau mai multe grupuri de procese. Exemplu: proc1 | proc2 & proc3 | proc4 | proc5 creaz o sesiune cu 3 grupuri de procese, ntr-un grup aflndu-se procesele dintr-un pipeline Un proces poate stabili o nou sesiune prin apelul sistem: pid_t setsid(void); Valoarea returnat de apel este un identificator de grup de procese la succes sau -1 n caz de eroare

Grupuri de procese, sesiuni, terminale de control (2)


Shell login
grup procese

proc1

proc3 proc5
grup procese sesiune

proc4

proc2
grup procese

Dac procesul care apeleaz setsid nu este lider de grup, prin acest apel se creeaz o nou sesiune i au loc urmtoarele:
Procesul devine lider de sesiune (momentan singurul proces din sesiune) Procesul devine lider de grup al unui nou grup de procese (pid-ul su devine identificator de grup) Procesul nu mai are terminal de control (dac a avut nainte de apelul la setsid)

Apelul setsid returneaz eroare dac procesul apelant este deja lider de grup. Pentru a evita aceast situaie se procedeaz astfel: un proces apeleaz fork, apoi se termin, asigurnd c procesul fiu nu e lider de grup; fiul poate deveni lider de sesiune dac apeleaz setsid

Grupuri de procese, sesiuni, terminale de control (3)


sesiune

Shell login
grup procese fundal lider sesiune = proces de control

proc1 proc2
grup procese fundal deconectare reea terminal de control

proc3 proc5

proc4

grup procese prim-plan intrare de la terminal & semnale generate de terminal

Principalele caracteristici ale sesiunilor i grupurilor:


O sesiune poate avea un singur terminal de control, de regul cel de la care utilizatorul a efectuat procedura de login Liderul de sesiune care stabilete legtura cu terminalul de control se numete proces de control Grupurile de procese dintr-o sesiune: un singur grup n prim plan i unul sau mai multe grupuri n fundal Dac o sesiune are terminal de control, atunci ea va avea un grup de procese n prim plan, iar toate celelalte grupuri vor fi n fundal Acionarea tastei de ntrerupere (DELETE sau Ctrl-C) sau a tastei de renunare (quit, Ctrl-\) determin trimiterea semnalelor respective la toate procesele din grupul n prim plan Dac se ntrerupe legtura n reea, liderul de sesiune primete un semnal hangup

Grupuri de procese, sesiuni, terminale de control (3)


Exist posibilitatea ca un proces s comunice cu terminalul de control indiferent dac intrarea i/sau ieirea standard au fost redirectate: trebuie deschis fiierul special /dev/tty, vzut n nucleu ca terminal de control. Dac procesul nu are terminal de control, operaia va eua Exist dou funcii de bibliotec prin care se poate comunica nucleului identitatea grupului de procese n prim-plan, respectiv un proces poate stabili identitatea acestui grup: pid_t tcgetpgrp(int filedes); int tcsetpgrp(int filedes, pid_t pgrpid); Funcia tcgetpgrp returneaz identificatorul grupului de procese n prim plan asociat cu terminalul deschis la filedes. Dac un proces are terminal de control, el poate apela tcsetpgrp pentru a fixa pgrpid ca identificator al grupului n prim-plan. Valoarea lui filedes corespunde terminalului de control al sesiunii n majoritatea aplicaiilor cele dou funcii nu sunt apelate direct din programele de aplicaii, ci din interpretoarele de comenzi prevzute cu faciliti pentru controlul joburilor Controlul joburilor este o facilitate care permite ca de la un singur terminal s fie pornite mai multe joburi (grupuri de procese) i s se specifice care joburi au drept de acces la terminal. Aceast facilitate necesit 3 forme de suport:
Un interpretor de comenzi adecvat Un driver de terminal adecvat n nucleu Suport pentru semnale specifice controlului joburilor

Grupuri de procese, sesiuni, terminale de control (4)


Suportul necesar n Shell este ca atunci cnd se pornete un job n fundal s se atribuie un identificator de job i s se afieze acest identificator mpreun cu cel puin un identificator de proces, ca n exemplu:
$ ls -al | grep ^d >ddd& [1] 26533 $ make >Make.out & [2] 26543 [1] Done $ [2]+ Done

ls --color=auto -al | grep ^d >ddd make >Make.out

Interaciunea cu driverul terminalului apare pentru c trebuie recunoscute trei caractere speciale care genereaz semnale pentru grupul de procese n prim-plan:
Caracterul de ntrerupere(DELETE sau Ctrl-C) care genereaz SIGINT Caracterul de renunare (Ctrl- \) care genereaz SIGQUIT Caracterul de suspendare (Ctrl-Z) care genereaz SIGSTP

Driverul terminalului trebuie s intervin i cnd un job din fundal ncearc s citeasc de la terminal: jobul respectiv trebuie s primeasc semnalul SIGTTIN, care duce n mod normal la oprirea (dar nu terminarea) acelui job Comunicarea de la un job n fundal spre terminal poate fi permis sau interzis cu comanda stty:
$ cat temp & [1] 2051 hello world # continutul lui temp apare imediat $ # aici trebuie tastat RETURN [1] + Done cat temp& $ stty tostop $ cat temp & [1] 2055 $ # aici se tasteaza RETURN [1] + Stopped(tty output) cat temp&

10.3.1. Semnale. Definiii


Semnalele pot fi definite ca ntreruperi software. Sunt o modalitate de tratare a evenimentelor asincrone i un mecanism elementar de comunicare ntre procese Condiii care conduc la generarea unui semnal:
Acionarea anumitor taste ale terminalului Apariia unor excepii hardware: mprire cu zero, referiri invalide la memorie, etc. Apelul sistem kill permite unui proces s trimit un semnal spre un alt proces sau grup de procese, asupra crora are drept de proprietate Comanda kill permite ca un utilizator s trimit semnale spre procese asupra crora are drept de proprietate Apariia unor condiii software care trebuie semnalate de ctre nucleu procesului curent, de ex. ncercarea de a scrie ntr-un pipe dup ce procesul care citete din acel pipe s-a terminat (SIGPIPE) sau expirarea unui interval de timp solicitat de proces (SIGALRM)

Aciunea pe care un proces o poate asocia unui semnal este una din urmtoarele:
Ignorarea semnalului. Se poate aplica majoritii semnalelor, cu excepia SIGKILL i SIGSTOP Interceptarea semnalului. La apariia semnalului se apeleaz o funcie definit de programator pentru tratarea semnalelor de tipul respectiv Aplicarea aciunii implicite, n majoritatea cazurilor terminarea sau oprirea procesului, cu sau fr vidaj de memorie. Sunt ignorate: SIGCHLD, SIGCONT, SIGINFO, SIGPWR, SIGURG, SIGWINCH

Semnale. Definiii (2)


Cele 31 de semnale tradiionale sunt:
SIGABRT: generat de nucleu pentru apelul abort SIGALRM: generat la expirarea unui interval de timp dat de apel alarm sau setitimer SIGBUS: eroare hardware, dependent de implementare SIGCHLD: trimis de nucleu la terminarea unui proces ctre procesul printe SIGCONT: trimis unui job oprit cnd acesta este continuat SIGEMT: eroare hardware dependent de implementare SIGFPE: semnaleaz o excepie aritmetic SIGHUP: trimis liderului de sesiune dac se detecteaz deconectare. La terminarea liderului de sesiune trimis tuturor proceselor din grupul prim-plan. Principala utilizare: anunarea proceselor daemon s-i citeasc fiierele de configurare SIGILL: execuia unei instruciuni ilegale n procesul curent SIGINFO: afiarea unor informaii de stare despre procesele n prim-plan cnd driverul terminalului primete caracterul de stare (Ctrl-T) SIGINT: generat de driverul terminalului la primirea caracterului de ntrerupere (Ctrl-C, DELETE). Se trimite tuturor proceselor n prim-plan SIGIO: indic eveniment I/E asincron SIGIOT: eroare hardware dependent de implementare SIGKILL: permite utilizatorului s termine n mod cert execuia unui proces. Nu poate fi ignorat SIGPIPE: generat la ncercarea de scriere ntr-o conduct dac procesul care citete s-a terminat. Asemntor la comunicarea n reea SIGPOLL: dependent de implementare, folosit la realizarea unor operaii de I/E speciale SIGPROF: generat la expirarea unui interval de timp de profilare, fixat printr-un apel setitimer SIGPWR: dependent de sistem, folosit n legtur cu sursele de tensiune nentreruptibile (UPS). Generat cnd se ntrerupe tensiunea i cnd puterea bateriei scade sub o anumit valoare

Semnale. Definiii (3)


SIGQUIT: generat de driverul terminalului cnd primete caracterul de renunare (Ctrl-\). Se trimite tuturor proceselor n prim-plan SIGSEGV: procesul curent a generat o referire la memorie invalid (ncercare de acces la o zon de memorie la care procesul nu are drept de acces) SIGSTOP: determin oprirea procesului curent; similar cu SIGTSTP, dar nu poate fi ignorat SIGSYS: indic un apel sistem invalid. Procesul a executat o instruciune interpretat ca apel sistem, dar tipul apelului nu corespunde unui apel recunoscut SIGTERM: este semnalul de terminare a procesului destinatar, trimis implicit de comanda kill. Poate fi ignorat, nu este cert c procesul se termin SIGTRAP: eroare hardware dependent de implementare SIGTSTP: semnal interactiv de oprire a unui proces, generat de driverul de terminal la primirea caracterului Ctrl-Z. Se trimite tuturor proceselor n prim plan SIGTTIN: generat de driverul terminalului cnd un proces dintr-un grup n fundal ncearc s citeasc de la terminalul de control. Nu se genereaz n 2 situaii: a) dac este ignorat sau blocat i b) dac grupul procesului este orfan; atunci se produce eroarea EIO SIGTTOU: generat de driverul terminalului cnd un proces dintr-un grup n fundal ncearc s scrie la terminalul de control. Operaia poate fi permis. Dac nu, se aplic situaiile speciale de la SIGTTIN SIGURG: generat cnd apar date urgente pe o conexiune n reea SIGUSR1, SIGUSR2: semnale la dispoziia utilizatorului, cu semantic dependent de aplicaie SIGVTALRM: generat la expirarea unui interval de timp virtual, fixat printr-un apel setitimer SIGWINCH: specific interfeelor grafice, generat n nucleu dac un proces modific dimensiunea unei ferestre(cu ioctl). Se trimite la toate procesele n prim-plan SIGXCPU: generat n nucleu cnd un proces depete limita de timp de procesor SIGXFSZ: generat la depirea dimensiunii limit pentru un fiier

10.3.2. Apelul sistem signal. Semnale nefiabile(1)


Apelul sistem signal permite unui proces s specifice funcia destinat tratrii unui anumit tip de semnal: #include <signal.h> void (*signal(int signo, void *(func)(int)))(int); signo este tipul de semnale ce vor fi tratate func reprezint funcia de tratare (obligatoriu cu argument de tip ntreg i fr valoare returnat) Apelul returneaz adresa vechii funcii de tratare Pentru func se pot folosi n particular 3 valori speciale: SIG_ERR (-1), SIG_DFL (0) i SIG_IGN (1) Funciile de tratare trebuie declarate static, pentru ca adresele lor s fie fixe La lansarea n execuie a unui program(cu un apel exec) starea semnalelor pentru un proces revine la tratarea implicit, pentru c adresa unei funcii de tratare are semnificaie numai ntr-un program Situaie tipic: la lansarea unui proces n fundal , interpretorul de comenzi asigur c SIGINT i SIGQUIT sunt ignorate. De aceea, programele interactive care intercepteaz aceste dou semnale se scriu astfel: if(signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, sig_int); Se observ o limitare a lui signal: nu se poate examina dispoziia curent pentru un semnal fr a o modifica Un proces fiu motenete de la printe dispoziia semnalelor: fiul fiind copia printelui, adresa funciei de tratare a unui semnal i pstreaz semnificaia

Apelul sistem signal. Semnale nefiabile(2)


Serioas limitare a modului de lucru tradiional cu semnale: tratarea este nefiabil; se pot pierde semnale, iar controlul procesului asupra semnalelor este redus: le poate doar ignora sau intercepta Pierderea semnalelor este cauzat de faptul c nucleul refcea dispoziia semnalului la cea implicit dup fiecare apariie. Funciile de tratare trebuiau scrise astfel:
sig_int(){ signal(SIGINT, sig_int); ... }

Chiar i n aceast form exist un interval, ntre apariia semnalului i apelul la signal n funcia de tratare, n care poate apare un semnal cruia i se aplic tratarea implicit Controlul asupra semnalelor: ar fi de dorit ca uneori procesul s poat bloca un semnal, fr a-l pierde, apoi s-l trateze mai trziu. Exemplul clasic:
main(){ signal(SIGINT, sig_int); while (sig_int_flag == 0) pause(); } sig_int(){ signal(SIGINT, sig_int); sig_int_flag = 1; }

Dac semnalul apare dup ce s-a testat sig_int_flag, dar nainte de a se efectua apelul la pause i este singurul astfel de semnal, procesul nu va mai putea fi reactivat

10.3.3. Apeluri sistem ntreruptibile. Funcii reentrante


Tradiional, dac procesul primete un semnal n timp ce se gsete ntr-un apel sistem lent, execuia apelului se ntrerupe i se returneaz eroare, valoarea lui errno fiind EINTR. Se presupune c dac a aprut un semnal i procesul l-a interceptat este probabil c s-a ntmplat ceva care poate reactiva un apel sistem blocat Apelurile sistem au fot divizate n lente i celelalte Apeluri lente (se pot bloca un timp nedefinit):
Citire din fiiere care pot bloca apelantul un timp nedefinit dac nu exist date disponibile: conducte, terminale, comunicare n reea Scrieri n aceleai tipuri de fiiere, dac datele nu pot fi acceptate imediat Deschiderea unor fiiere, ex. deschiderea unui terminal la distan, care nu e conectat nc la reea Apelurile pause (prin definiie pune apelantul n ateptare pn la apariia unui semnal) i wait Anumite operaii ioctl Unele apeluri pentru comunicarea interprocese

Se excepteaz apelurile care implic operaii cu discul Trebuie tratat explicit cazul cnd eroarea returnat este EINTR: again: if (( n=read(fd, buff, BUFSIZE)) < 0) { if (errno == EINTR) goto again; /* tratarea altor tipuri de erori */ } Unele implementri UNIX ofer posibilitatea relurii automate a apelurilor ntrerupte Cnd se trateaz un semnal procesul prsete secvena normal, unde se revine dup funcia de tratare Pentru ca s nu apar probleme (ex. procesul executa malloc i funcia de tratare apeleaz malloc) se impune ca majoritatea apelurilor sistem s fie reentrante, adic s poat fi apelate din nou nainte de a se termina execuia unui apel anterior. Nu sunt admise date statice i apeluri de funcii din biblioteca standard de I/E Problem special: errno (exist una singur per proces, trebuie salvat n funciile de tratare nainte de un apel sistem)

10.3.4. Semnale fiabile (1)


Un semnal este generat sau trimis unui proces cnd se produce evenimentul care l cauzeaz (se poziioneaz un fanion n tabela de procese) Semnalul este livrat unui proces cnd se declaneaz aciunea asociat semnalului; pn atunci semnalul este n ateptare (pending) Un proces poate bloca un semnal: dac este generat i procesul nu l ignor, semnalul rmne n ateptare pn cnd procesul l deblocheaz sau ignor. Nucleul decide ce se ntmpl cu un semnal la livrarea, nu la generarea sa Dac n timp ce un semnal este blocat se genereaz mai multe astfel de semnale, n majoritatea implementrilor se reine o singur apariie Dac la un moment dat exist mai multe semnale care ar putea fi livrate unui proces, ordinea de livrare nu este impus; se recomand s se dea prioritate semnalelor care pot afecta starea procesului, ca SIGSEGV Fiecare proces pstreaz n tabela de procese o masc de semnale, care precizeaz tipurile de semnale momentan blocate Apelurile sistem pentru trimiterea de semnale ctre procese: int kill (pid_t pid, int signo); int raise (int signo); raise trimite semnalul signo procesului curent La apelul kill, argumentul pid este interpretat astfel: pid > 0 : semnalul este trimis procesului identificat de pid pid == 0 : semnalul este trimis tuturor proceselor cu acelai identificator de grup, crora apelantul are dreptul s le trimit semnale pid < 0 : semnalul este trimis tuturor proceselor cu identificatorul de grup |pid|, crora apelantul le poate trimite semnale pid == -1 : comportarea este dependent de implementare Superutilizatorul poate trimite semnale oricrui proces. Ali utilizatori: UID-ul real sau efectiv al emitorului s fie egal cu UID-ul real sau efectiv al destinatarului. SIGCONT poate fi trimis oricrui alt proces din aceeai sesiune

Semnale fiabile (2)


Situaie special: semnalul cu numrul 0 (semnalul nul) poate fi folosit de apelul kill pentru a verifica dac un proces mai exist; apelul returneaz -1 dac procesul nu exist, iar valoarea lui errno este ESRCH. Atenie: poate exista un alt proces cu acelai pid Alte dou apeluri legate de semnale: unsigned int alarm(unsigned int seconds); int pause(void); Argumentul seconds este intervalul dup care se va produce un semnal SIGALRM, trimis procesului apelant (privit ca valoare minim) La un moment dat un proces poate avea o singur alarm; dac n momentul apelului procesul are deja o alarm, timpul rmas este returnat ca valoare a apelului, iar seconds devine noua valoare a alarmei. Dac seconds e 0, alarma se anuleaz Aciunea implicit pentru SIGALRM este terminarea procesului, dar multe aplicaii intercepteaz semnalul i l folosesc, de ex., pentru a limita durata unei operaii de I/E Revenirea din pause se produce numai n urma execuiei unei funcii de tratare a unui semnal pentru procesul curent. Atunci se returneaz -1, iar errno este EINTR Cteva probleme:
S-ar putea compara valoarea returnat de un apel la alarm i valoarea din alarm i, cu un eventual nou apel alarm, atepta valoarea mai mic Dac ntr-o funcie se modific dispoziia pentru SIGALRM, se poate reface dispoziia nainte de revenirea din funcie dac s-a salvat vechea dispoziie (returnat de signal) n codul: if (setjmp(env_alrm) == 0){ alarm(seconds); pause(); } ar putea exista o condiie de curs ntre apelurile alarm i pause, rezolvat prin utilizarea lui setjmp

Pentru a putea reprezenta semnale multiple s-a introdus tipul sigset_t i cteva funcii pentru operaii cu acesta: 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(const sigset_t *set, int signo); n orice program care lucreaz cu semnale trebuie apelat fie sigemptyset, fie sigfillset, pentru a asigura iniializarea corect a valorilor de tip sigset_t Exist mai multe apeluri sistem care se bazeaz pe seturi de semnale Apelul sigprocmask permite examinarea sau modificarea mtii de semnale a unui proces: int sigprocmask(int how, const sigset_t *set, sigset_t *oset); Dac oset este nenul, valoarea curent a mtii de semnale se returneaz prin oset Dac set este nenul, prin how se arat cum se modific masca de semnale curent. Valori posibile pentru how: SIG_BLOCK: noua masc este reuniunea celei curente cu cea indicat de set SIG_UNBLOCK: noua masc este intersecia celei curente cu complementul celei indicate de set SIG_SETMASK: noua masc este valoarea spre care indic set Dac exist semnale n ateptare dintre cele care se deblocheaz dup apelul la sigprocmask, atunci cel puin unul va fi livrat procesului nainte de revenirea din sigprocmask Apelul sigpending permite obinerea setului de semnale blocate de la livrare, momentan n ateptare: int sigpending(sigset_t *set); Setul de semnale este returnat prin argumentul set. Apelul returneaz 0 la succes i -1 la eroare

10.3.5. Seturi de semnale. Apeluri specifice(1)

Seturi de semnale. Apeluri specifice(2)


Apelul sigaction nlocuiete apelul signal i permite att examinarea, ct i modificarea aciunii asociate cu un anumit semnal: int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); Dac act este nenul, aciunea asociat semnalului signo se va modifica. Dac oact este nenul, prin acest pointer se returneaz vechea dispoziie a semnalului Structura sigaction este definit astfel: struct sigaction { void (*sa_handler)(); sigset_t sa_mask; int sa_flags; }; La schimbarea aciunii pentru un semnal, dac sa_handler indic spre o funcie de tratare ( nu e SIG_IGN sau SIG_DFL) cmpul sa_mask specific setul de semnale adugate la masca de semnale a procesului nainte de apelul funciei de tratare. La revenirea din funcia de tratare masca se reface la vechea valoare. Masca include automat i semnalele de tipul celui tratat (blocheaz o nou apariie a aceluiai tip de semnal) O aciune instalat pentru un semnal rmne valabil pn la schimbarea explicit prin alt apel la sigaction Cmpul sa_flags specific opiuni de tratare: SA_NOCLDSTOP: dac signo este SIGCHLD nu se genereaz semnalul cnd procesul este oprit (se genereaz numai la terminare) SA_RESTART: apelurile sistem ntrerupte de semnal sunt repornite automat SA_ONSTACK: dac s-a declarat o stiv alternativ, semnalul este livrat procesului n stiva alternativ SA_NOCHLDWAIT: dac signo este SIGCHLD sistemul nu creeaz procese zombie la terminarea fiilor procesului apelant. Dac ulterior procesul apeleaz wait se blocheaz pn se termin toi fiii, apoi returneaz -1

Seturi de semnale. Apeluri specifice(3)


SA_NODEFER: la interceptarea semnalului nu sunt blocate semnalele de acelai tip ( specific semnalelor nefiabile) SA_RESETHAND:dispoziia pentru semnal devine SIG_DFL la intrarea n funcia de tratare ( specific semnalelor nefiabile) Apelul sigsuspend. Prin modificarea mtii de semnale se pot proteja seciuni critice de cod: un semnal este blocat nainte de seciunea critic i deblocat la terminarea seciunii. Se poate presupune o situaie n care dup seciunea critic aplicaia apeleaz pause, de unde iese la apariia semnalului blocat. O form incorect de tratare: sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* codul seciunii critice */ sigprocmask(SIG_SETMASK, &oldmask, 0); pause(); Dac semnalul apare ntre deblocare i apelul la pause, el va fi pierdut. Trebuie ca repoziionarea mtii de semnale i punerea procesului n ateptare s se fac sub forma unei operaii atomice, ceea ce realizeaz sigsuspend, cu prototipul: int sigsuspend(const sigset_t *sigmask); Dup apel masca procesului este sigmask, iar procesul este suspendat pn la interceptarea unui semnal care este tratat sau care termin procesul Nu exist revenire normal din acest apel, ntotdeauna se returneaz apelantului -1, iar valoarea lui errno va fi EINTR (dac semnalul termin procesul, nu se mai revine din sigsuspend) Dup revenirea din sigsuspend masca de semnale este implicit repoziionat la valoarea pe care o avea nainte de apel

10

Vous aimerez peut-être aussi