• Aucun résultat trouvé

Terminal de contr^ole Sessions Groupes de processus

Dans le document Cours Unix à télécharger pdf - startdown (Page 91-93)

L'ensemble des processus existant dans le systeme a un moment donne est partitionne en sessions : tout processus appartient a une seule et unique session, on herite de la session du processus pere.

Un processus qui n'est pasleaderde groupe peut creer une nouvelle session avec la primitive

#include <unistd.h> pid_t setsid(void)

Lors du login, le processus shell cree est le leaderd'une nouvelle session. Une tel session est caracterisee par le terminal de l'utilisateur (sur lequel il se loge) qui devient le

terminal

de contr^ole

de la session. Tous les processus de la session sont informes de la frappe des caracteres de contr^ole sur le terminal

intr, quit, susp.

Le terminal de contr^ole est symbolise par la reference "/dev/tty".

Lorsque leleaderd'une session attachee a un terminal se

termine

tous les processus de la session re"coivent le signal SIGHUP et sont alors interrompus (on realise sur llmore une n de session en tuant la fen^etre console, ce qui termine le processus shell leader ...) sauf si un handler a ete positionne pour le signal SIGHUP. On peut realiser ceci en sh avec la commandenohup,

ou la commandetrapqui permettent d'ignorer le signal SIGHUP. Le terminal de contr^ole et

la session d'un tel processus resistant n'est pas normee dans POSIX.

11.2.1 Acquisition d'un terminal de contr^ole par une session

A sa creation, une session n'a pas de terminal de contr^ole!

L'acquisition d'un terminal de contr^ole n'est pas normee, mais, si l'on ouvre un terminal qui n'est pas le terminal de contr^ole d'une autre session avec un processus leaderqui n'a pas de terminal de contr^ole, alors le terminal ouvert devient le terminal de contr^ole de la session.

11.2. TERMINALDECONTROLE-SESSIONS-GROUPESDEPROCESSUS 85

11.2.2 Groupes de processus

Les

groupes de processus

sont un ranement POSIX de la notion de session. Ils per- mettent de travailler avec des groupes de processus sans toutes les obligations liees aux ses- sions.

L'objectif est de specier l'ensemble des processus qui sont interactifs sur un terminal donne a un moment donne, et donc qui ont le droit de lire sur le terminal et de plus sont informes de la frappe des caracteres de contr^ole.

Un groupe de processusest identie par le PID du leaderdu groupe, a la naissance, un processus herite du groupe de son pere. La primitive suivante :

#include <unistd.h>

pid_t setpgid(pid_t pid, pid_t id_grp)

permet de rattacher le processuspidau groupeid grp. Si pidest nul c'est le processus courant qui est rattache. Si id grpest nul le numero deduit depidest utilise.

Dans tous les cas soit le groupe existe et le processus est rattache, soit le groupe est cree et le processus traite devient le leader du groupe.

Un processus ne peut ^etre rattache qu'a un groupe appartenant a la m^eme session que lui,c'est-a-dire, que les groupes sont denis a l'interieur des sessions.

La primitive

#include <unistd.h> pid_t getpgrp(void)

renvoie le numero duleaderdu groupe du processus courant. Sur certaines machines, la primitive

#include <unistd.h> pid_t getgrp2(pid_t pid)

renvoie le numero du groupe du processuspid.

11.2.3 Premier Plan et Arriere Plan

Le

premier plan

est l'unique sous-groupe de processus de la session qui est en mode interactif. Les processus de ce groupe peuvent lire et ecrire sur le terminal, ce sont les processus qui re"coivent les signaux engendres par les caracteres de contr^ole. Les groupes en

arriere

plan

sont tous les autres sous-groupes de la session. En csh/ksh ce sont tous les processus lances en t^ache de fond (&), que l'on peut manipuler avec les commandesfgetbg.

Ces groupes ne peuvent lire sur le terminal (signaux SIGTTIN et SIGTTOU), de plus a la frappe de caractere de contr^ole sur le terminal ils ne re"coivent pas de signaux.

Avant POSIX les processus lances en t^ache de fond par le shell ignoraient les signaux SIGINT et SIGQUIT et avaient leur entree standard redirigee sur le "trou noir" : /dev/null.

11.2.4 Quelques fonctions

Quelques fonctions d'information sur les sessions et les groupes. Elles necessite toute l'include

#include <unistd.h>

La primitive

pid_t tcgetsid(int desc)

renvoie l'identite du processus leader.

La primitive renvoie -1 si le terminal n'est pas terminal de contr^ole.

processus tampon d’ criture tampon de lecture ECHO terminal struct termios modes contr le modes sortie modes entr e modes locaux caract res contr le

c_cc

Fig.11.1{Structure de la communication entre le processus et le terminal.

renvoie l'identite du leader de la session du processus pid. Si pid ==0 c'est le pid du processus courant qui est utilise, un appel equivalent agetsid(getpid())mais avec un appel

systeme de moins.

Changement du groupe en premier plan

La primitive

pid_t tcgetgrp(int desc)

renvoie le groupe de processus en premier plan associe au terminal de contr^ole indique par le descripteurdesc.

Ceci s'applique evidement uniquement au terminal de contr^ole de la session du processus cou- rant.

La primitive

pid_t tcsetpgrp(int desc, pid_t id_grp)

permet de placer en premier plan le groupe id grp dans la session associee au terminal pointe pardesc.

Dans le document Cours Unix à télécharger pdf - startdown (Page 91-93)