Académique Documents
Professionnel Documents
Culture Documents
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
init
apel fork pt. fiec. terminal
fork
init
desch. term. cit. nume constr. amb.
getty
getty
login
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
Shell login
grup procese fundal lider sesiune = proces de control
proc1 proc2
grup procese fundal deconectare reea terminal de control
proc3 proc5
proc4
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&
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
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
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)
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